aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libX11/include/X11/Xlibint.h2
-rw-r--r--libX11/man/DisplayOfCCC.man2
-rw-r--r--libX11/man/Makefile.am2162
-rw-r--r--libX11/man/XChangeKeyboardMapping.man2
-rw-r--r--libX11/man/xkb/XkbPtrActionX.man208
-rw-r--r--libX11/man/xkb/XkbPtrActionY.man208
-rw-r--r--libX11/man/xkb/XkbSetPtrActionX.man216
-rw-r--r--libX11/man/xkb/XkbSetPtrActionY.man216
-rw-r--r--mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c7
-rw-r--r--mesalib/src/mesa/main/dlist.c22
-rw-r--r--mesalib/src/mesa/main/fbobject.c5076
-rw-r--r--mesalib/src/mesa/main/texrender.c1311
-rw-r--r--pixman/test/composite.c4
-rw-r--r--xorg-server/xkeyboard-config/configure.in248
-rw-r--r--xorg-server/xkeyboard-config/po/xkeyboard-config.pot1972
-rw-r--r--xorg-server/xkeyboard-config/rules/base.extras.xml.in44
-rw-r--r--xorg-server/xkeyboard-config/rules/base.xml.in12
-rw-r--r--xorg-server/xkeyboard-config/symbols/am8
-rw-r--r--xorg-server/xkeyboard-config/symbols/lt625
-rw-r--r--xorg-server/xkeyboard-config/symbols/ru65
20 files changed, 6252 insertions, 6158 deletions
diff --git a/libX11/include/X11/Xlibint.h b/libX11/include/X11/Xlibint.h
index ce3d25fab..2ce356d15 100644
--- a/libX11/include/X11/Xlibint.h
+++ b/libX11/include/X11/Xlibint.h
@@ -792,7 +792,7 @@ typedef int (*FreeModmapType) (
*/
typedef struct _XFreeFuncs {
FreeFuncType atoms; /* _XFreeAtomTable */
- FreeModmapType modifiermap; /* XFreeModifierMap */
+ FreeModmapType modifiermap; /* XFreeModifiermap */
FreeFuncType key_bindings; /* _XFreeKeyBindings */
FreeFuncType context_db; /* _XFreeContextDB */
FreeFuncType defaultCCCs; /* _XcmsFreeDefaultCCCs */
diff --git a/libX11/man/DisplayOfCCC.man b/libX11/man/DisplayOfCCC.man
index 8f2aad6ab..160eeb57f 100644
--- a/libX11/man/DisplayOfCCC.man
+++ b/libX11/man/DisplayOfCCC.man
@@ -175,7 +175,7 @@ macro returns the screen white point of the screen associated with
the specified CCC.
.LP
The
-.ZN ClientWhitePointOfCC
+.ZN ClientWhitePointOfCCC
macro returns the client white point of the screen associated with
the specified CCC.
.SH "SEE ALSO"
diff --git a/libX11/man/Makefile.am b/libX11/man/Makefile.am
index 2b4bedadb..ef1a7453f 100644
--- a/libX11/man/Makefile.am
+++ b/libX11/man/Makefile.am
@@ -1,1081 +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
-
+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/libX11/man/XChangeKeyboardMapping.man b/libX11/man/XChangeKeyboardMapping.man
index d4bb9a02f..71b7a9142 100644
--- a/libX11/man/XChangeKeyboardMapping.man
+++ b/libX11/man/XChangeKeyboardMapping.man
@@ -141,7 +141,7 @@
.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
+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,
diff --git a/libX11/man/xkb/XkbPtrActionX.man b/libX11/man/xkb/XkbPtrActionX.man
index fcb353001..7116185c4 100644
--- a/libX11/man/xkb/XkbPtrActionX.man
+++ b/libX11/man/xkb/XkbPtrActionX.man
@@ -1,104 +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 coordinantes 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
+'\" 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/libX11/man/xkb/XkbPtrActionY.man b/libX11/man/xkb/XkbPtrActionY.man
index 844277d88..ad10214ea 100644
--- a/libX11/man/xkb/XkbPtrActionY.man
+++ b/libX11/man/xkb/XkbPtrActionY.man
@@ -1,104 +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 coordinantes 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
+'\" 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/libX11/man/xkb/XkbSetPtrActionX.man b/libX11/man/xkb/XkbSetPtrActionX.man
index 5888d46dc..2bd56b255 100644
--- a/libX11/man/xkb/XkbSetPtrActionX.man
+++ b/libX11/man/xkb/XkbSetPtrActionX.man
@@ -1,108 +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 coordinantes 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
+'\" 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/libX11/man/xkb/XkbSetPtrActionY.man b/libX11/man/xkb/XkbSetPtrActionY.man
index 895454ea7..d8da0f20f 100644
--- a/libX11/man/xkb/XkbSetPtrActionY.man
+++ b/libX11/man/xkb/XkbSetPtrActionY.man
@@ -1,108 +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 coordinantes 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
+'\" 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/mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c b/mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c
index a034483ee..04149525e 100644
--- a/mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c
+++ b/mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c
@@ -581,7 +581,12 @@ static void u_vbuf_mgr_compute_max_index(struct u_vbuf_mgr_priv *mgr)
* for that when dividing by stride. */
unused = vb->stride -
(mgr->ve->ve[i].src_offset + mgr->ve->src_format_size[i]);
- assert(unused >= 0);
+
+ /* If src_offset is greater than stride (which means it's a buffer
+ * offset rather than a vertex offset)... */
+ if (unused < 0) {
+ unused = 0;
+ }
/* Compute the maximum index for this vertex element. */
max_index =
diff --git a/mesalib/src/mesa/main/dlist.c b/mesalib/src/mesa/main/dlist.c
index 930236c01..2aba82fc0 100644
--- a/mesalib/src/mesa/main/dlist.c
+++ b/mesalib/src/mesa/main/dlist.c
@@ -5351,7 +5351,7 @@ save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value)
}
#endif
-static void
+static void GLAPIENTRY
save_Attr1fNV(GLenum attr, GLfloat x)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5372,7 +5372,7 @@ save_Attr1fNV(GLenum attr, GLfloat x)
}
}
-static void
+static void GLAPIENTRY
save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5394,7 +5394,7 @@ save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y)
}
}
-static void
+static void GLAPIENTRY
save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5417,7 +5417,7 @@ save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
}
}
-static void
+static void GLAPIENTRY
save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5442,7 +5442,7 @@ save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
}
-static void
+static void GLAPIENTRY
save_Attr1fARB(GLenum attr, GLfloat x)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5463,7 +5463,7 @@ save_Attr1fARB(GLenum attr, GLfloat x)
}
}
-static void
+static void GLAPIENTRY
save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5485,7 +5485,7 @@ save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y)
}
}
-static void
+static void GLAPIENTRY
save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
{
GET_CURRENT_CONTEXT(ctx);
@@ -5508,7 +5508,7 @@ save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
}
}
-static void
+static void GLAPIENTRY
save_Attr4fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
GET_CURRENT_CONTEXT(ctx);
@@ -7040,7 +7040,7 @@ exec_GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params)
/* GL_ARB_instanced_arrays */
-static void
+static void GLAPIENTRY
save_VertexAttribDivisor(GLuint index, GLuint divisor)
{
GET_CURRENT_CONTEXT(ctx);
@@ -7058,7 +7058,7 @@ save_VertexAttribDivisor(GLuint index, GLuint divisor)
/* GL_NV_texture_barrier */
-static void
+static void GLAPIENTRY
save_TextureBarrierNV(void)
{
GET_CURRENT_CONTEXT(ctx);
@@ -7071,7 +7071,7 @@ save_TextureBarrierNV(void)
/* GL_ARB_sampler_objects */
-static void
+static void GLAPIENTRY
save_BindSampler(GLuint unit, GLuint sampler)
{
Node *n;
diff --git a/mesalib/src/mesa/main/fbobject.c b/mesalib/src/mesa/main/fbobject.c
index 68a141d29..67df53b88 100644
--- a/mesalib/src/mesa/main/fbobject.c
+++ b/mesalib/src/mesa/main/fbobject.c
@@ -1,2539 +1,2537 @@
-/*
- * Mesa 3-D graphics library
- * Version: 7.1
- *
- * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
- * Copyright (C) 1999-2009 VMware, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/*
- * GL_EXT/ARB_framebuffer_object extensions
- *
- * Authors:
- * Brian Paul
- */
-
-
-#include "buffers.h"
-#include "context.h"
-#include "enums.h"
-#include "fbobject.h"
-#include "formats.h"
-#include "framebuffer.h"
-#include "hash.h"
-#include "macros.h"
-#include "mfeatures.h"
-#include "mtypes.h"
-#include "renderbuffer.h"
-#include "state.h"
-#include "teximage.h"
-#include "texobj.h"
-
-
-/** Set this to 1 to help debug FBO incompleteness problems */
-#define DEBUG_FBO 0
-
-/** Set this to 1 to debug/log glBlitFramebuffer() calls */
-#define DEBUG_BLIT 0
-
-
-/**
- * Notes:
- *
- * None of the GL_EXT_framebuffer_object functions are compiled into
- * display lists.
- */
-
-
-
-/*
- * When glGenRender/FramebuffersEXT() is called we insert pointers to
- * these placeholder objects into the hash table.
- * Later, when the object ID is first bound, we replace the placeholder
- * with the real frame/renderbuffer.
- */
-static struct gl_framebuffer DummyFramebuffer;
-static struct gl_renderbuffer DummyRenderbuffer;
-
-/* We bind this framebuffer when applications pass a NULL
- * drawable/surface in make current. */
-static struct gl_framebuffer IncompleteFramebuffer;
-
-
-#define IS_CUBE_FACE(TARGET) \
- ((TARGET) >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && \
- (TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
-
-
-static void
-delete_dummy_renderbuffer(struct gl_renderbuffer *rb)
-{
- /* no op */
-}
-
-static void
-delete_dummy_framebuffer(struct gl_framebuffer *fb)
-{
- /* no op */
-}
-
-
-void
-_mesa_init_fbobjects(struct gl_context *ctx)
-{
- _glthread_INIT_MUTEX(DummyFramebuffer.Mutex);
- _glthread_INIT_MUTEX(DummyRenderbuffer.Mutex);
- _glthread_INIT_MUTEX(IncompleteFramebuffer.Mutex);
- DummyFramebuffer.Delete = delete_dummy_framebuffer;
- DummyRenderbuffer.Delete = delete_dummy_renderbuffer;
- IncompleteFramebuffer.Delete = delete_dummy_framebuffer;
-}
-
-struct gl_framebuffer *
-_mesa_get_incomplete_framebuffer(void)
-{
- return &IncompleteFramebuffer;
-}
-
-/**
- * Helper routine for getting a gl_renderbuffer.
- */
-struct gl_renderbuffer *
-_mesa_lookup_renderbuffer(struct gl_context *ctx, GLuint id)
-{
- struct gl_renderbuffer *rb;
-
- if (id == 0)
- return NULL;
-
- rb = (struct gl_renderbuffer *)
- _mesa_HashLookup(ctx->Shared->RenderBuffers, id);
- return rb;
-}
-
-
-/**
- * Helper routine for getting a gl_framebuffer.
- */
-struct gl_framebuffer *
-_mesa_lookup_framebuffer(struct gl_context *ctx, GLuint id)
-{
- struct gl_framebuffer *fb;
-
- if (id == 0)
- return NULL;
-
- fb = (struct gl_framebuffer *)
- _mesa_HashLookup(ctx->Shared->FrameBuffers, id);
- return fb;
-}
-
-
-/**
- * Mark the given framebuffer as invalid. This will force the
- * test for framebuffer completeness to be done before the framebuffer
- * is used.
- */
-static void
-invalidate_framebuffer(struct gl_framebuffer *fb)
-{
- fb->_Status = 0; /* "indeterminate" */
-}
-
-
-/**
- * Return the gl_framebuffer object which corresponds to the given
- * framebuffer target, such as GL_DRAW_FRAMEBUFFER.
- * Check support for GL_EXT_framebuffer_blit to determine if certain
- * targets are legal.
- * \return gl_framebuffer pointer or NULL if target is illegal
- */
-static struct gl_framebuffer *
-get_framebuffer_target(struct gl_context *ctx, GLenum target)
-{
- switch (target) {
- case GL_DRAW_FRAMEBUFFER:
- return ctx->Extensions.EXT_framebuffer_blit ? ctx->DrawBuffer : NULL;
- case GL_READ_FRAMEBUFFER:
- return ctx->Extensions.EXT_framebuffer_blit ? ctx->ReadBuffer : NULL;
- case GL_FRAMEBUFFER_EXT:
- return ctx->DrawBuffer;
- default:
- return NULL;
- }
-}
-
-
-/**
- * Given a GL_*_ATTACHMENTn token, return a pointer to the corresponding
- * gl_renderbuffer_attachment object.
- * This function is only used for user-created FB objects, not the
- * default / window-system FB object.
- * If \p attachment is GL_DEPTH_STENCIL_ATTACHMENT, return a pointer to
- * the depth buffer attachment point.
- */
-struct gl_renderbuffer_attachment *
-_mesa_get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
- GLenum attachment)
-{
- GLuint i;
-
- assert(fb->Name > 0);
-
- switch (attachment) {
- case GL_COLOR_ATTACHMENT0_EXT:
- case GL_COLOR_ATTACHMENT1_EXT:
- case GL_COLOR_ATTACHMENT2_EXT:
- case GL_COLOR_ATTACHMENT3_EXT:
- case GL_COLOR_ATTACHMENT4_EXT:
- case GL_COLOR_ATTACHMENT5_EXT:
- case GL_COLOR_ATTACHMENT6_EXT:
- case GL_COLOR_ATTACHMENT7_EXT:
- case GL_COLOR_ATTACHMENT8_EXT:
- case GL_COLOR_ATTACHMENT9_EXT:
- case GL_COLOR_ATTACHMENT10_EXT:
- case GL_COLOR_ATTACHMENT11_EXT:
- case GL_COLOR_ATTACHMENT12_EXT:
- case GL_COLOR_ATTACHMENT13_EXT:
- case GL_COLOR_ATTACHMENT14_EXT:
- case GL_COLOR_ATTACHMENT15_EXT:
- i = attachment - GL_COLOR_ATTACHMENT0_EXT;
- if (i >= ctx->Const.MaxColorAttachments) {
- return NULL;
- }
- return &fb->Attachment[BUFFER_COLOR0 + i];
- case GL_DEPTH_STENCIL_ATTACHMENT:
- /* fall-through */
- case GL_DEPTH_BUFFER:
- /* fall-through / new in GL 3.0 */
- case GL_DEPTH_ATTACHMENT_EXT:
- return &fb->Attachment[BUFFER_DEPTH];
- case GL_STENCIL_BUFFER:
- /* fall-through / new in GL 3.0 */
- case GL_STENCIL_ATTACHMENT_EXT:
- return &fb->Attachment[BUFFER_STENCIL];
- default:
- return NULL;
- }
-}
-
-
-/**
- * As above, but only used for getting attachments of the default /
- * window-system framebuffer (not user-created framebuffer objects).
- */
-static struct gl_renderbuffer_attachment *
-_mesa_get_fb0_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
- GLenum attachment)
-{
- assert(fb->Name == 0);
-
- switch (attachment) {
- case GL_FRONT_LEFT:
- return &fb->Attachment[BUFFER_FRONT_LEFT];
- case GL_FRONT_RIGHT:
- return &fb->Attachment[BUFFER_FRONT_RIGHT];
- case GL_BACK_LEFT:
- return &fb->Attachment[BUFFER_BACK_LEFT];
- case GL_BACK_RIGHT:
- return &fb->Attachment[BUFFER_BACK_RIGHT];
- case GL_AUX0:
- if (fb->Visual.numAuxBuffers == 1) {
- return &fb->Attachment[BUFFER_AUX0];
- }
- return NULL;
- case GL_DEPTH_BUFFER:
- /* fall-through / new in GL 3.0 */
- case GL_DEPTH_ATTACHMENT_EXT:
- return &fb->Attachment[BUFFER_DEPTH];
- case GL_STENCIL_BUFFER:
- /* fall-through / new in GL 3.0 */
- case GL_STENCIL_ATTACHMENT_EXT:
- return &fb->Attachment[BUFFER_STENCIL];
- default:
- return NULL;
- }
-}
-
-
-
-/**
- * Remove any texture or renderbuffer attached to the given attachment
- * point. Update reference counts, etc.
- */
-void
-_mesa_remove_attachment(struct gl_context *ctx,
- struct gl_renderbuffer_attachment *att)
-{
- if (att->Type == GL_TEXTURE) {
- ASSERT(att->Texture);
- if (ctx->Driver.FinishRenderTexture) {
- /* tell driver that we're done rendering to this texture. */
- ctx->Driver.FinishRenderTexture(ctx, att);
- }
- _mesa_reference_texobj(&att->Texture, NULL); /* unbind */
- ASSERT(!att->Texture);
- }
- if (att->Type == GL_TEXTURE || att->Type == GL_RENDERBUFFER_EXT) {
- ASSERT(!att->Texture);
- _mesa_reference_renderbuffer(&att->Renderbuffer, NULL); /* unbind */
- ASSERT(!att->Renderbuffer);
- }
- att->Type = GL_NONE;
- att->Complete = GL_TRUE;
-}
-
-
-/**
- * Bind a texture object to an attachment point.
- * The previous binding, if any, will be removed first.
- */
-void
-_mesa_set_texture_attachment(struct gl_context *ctx,
- struct gl_framebuffer *fb,
- struct gl_renderbuffer_attachment *att,
- struct gl_texture_object *texObj,
- GLenum texTarget, GLuint level, GLuint zoffset)
-{
- if (att->Texture == texObj) {
- /* re-attaching same texture */
- ASSERT(att->Type == GL_TEXTURE);
- if (ctx->Driver.FinishRenderTexture)
- ctx->Driver.FinishRenderTexture(ctx, att);
- }
- else {
- /* new attachment */
- if (ctx->Driver.FinishRenderTexture && att->Texture)
- ctx->Driver.FinishRenderTexture(ctx, att);
- _mesa_remove_attachment(ctx, att);
- att->Type = GL_TEXTURE;
- assert(!att->Texture);
- _mesa_reference_texobj(&att->Texture, texObj);
- }
-
- /* always update these fields */
- att->TextureLevel = level;
- att->CubeMapFace = _mesa_tex_target_to_face(texTarget);
- att->Zoffset = zoffset;
- att->Complete = GL_FALSE;
-
- if (_mesa_get_attachment_teximage(att)) {
- ctx->Driver.RenderTexture(ctx, fb, att);
- }
-
- invalidate_framebuffer(fb);
-}
-
-
-/**
- * Bind a renderbuffer to an attachment point.
- * The previous binding, if any, will be removed first.
- */
-void
-_mesa_set_renderbuffer_attachment(struct gl_context *ctx,
- struct gl_renderbuffer_attachment *att,
- struct gl_renderbuffer *rb)
-{
- /* XXX check if re-doing same attachment, exit early */
- _mesa_remove_attachment(ctx, att);
- att->Type = GL_RENDERBUFFER_EXT;
- att->Texture = NULL; /* just to be safe */
- att->Complete = GL_FALSE;
- _mesa_reference_renderbuffer(&att->Renderbuffer, rb);
-}
-
-
-/**
- * Fallback for ctx->Driver.FramebufferRenderbuffer()
- * Attach a renderbuffer object to a framebuffer object.
- */
-void
-_mesa_framebuffer_renderbuffer(struct gl_context *ctx,
- struct gl_framebuffer *fb,
- GLenum attachment, struct gl_renderbuffer *rb)
-{
- struct gl_renderbuffer_attachment *att;
-
- _glthread_LOCK_MUTEX(fb->Mutex);
-
- att = _mesa_get_attachment(ctx, fb, attachment);
- ASSERT(att);
- if (rb) {
- _mesa_set_renderbuffer_attachment(ctx, att, rb);
- if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
- /* do stencil attachment here (depth already done above) */
- att = _mesa_get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT);
- assert(att);
- _mesa_set_renderbuffer_attachment(ctx, att, rb);
- }
- rb->AttachedAnytime = GL_TRUE;
- }
- else {
- _mesa_remove_attachment(ctx, att);
- }
-
- invalidate_framebuffer(fb);
-
- _glthread_UNLOCK_MUTEX(fb->Mutex);
-}
-
-
-/**
- * Fallback for ctx->Driver.ValidateFramebuffer()
- * Check if the renderbuffer's formats are supported by the software
- * renderer.
- * Drivers should probably override this.
- */
-void
-_mesa_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
-{
- gl_buffer_index buf;
- for (buf = 0; buf < BUFFER_COUNT; buf++) {
- const struct gl_renderbuffer *rb = fb->Attachment[buf].Renderbuffer;
- if (rb) {
- switch (rb->_BaseFormat) {
- case GL_ALPHA:
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE:
- case GL_INTENSITY:
- case GL_RED:
- case GL_RG:
- fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
- return;
- case GL_RGB:
- switch (rb->Format) {
- case MESA_FORMAT_RGB9_E5_FLOAT:
- fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
- return;
- default:;
- }
- break;
-
- default:
- /* render buffer format is supported by software rendering */
- ;
- }
- }
- }
-}
-
-
-/**
- * For debug only.
- */
-static void
-att_incomplete(const char *msg)
-{
-#if DEBUG_FBO
- _mesa_debug(NULL, "attachment incomplete: %s\n", msg);
-#else
- (void) msg;
-#endif
-}
-
-
-/**
- * For debug only.
- */
-static void
-fbo_incomplete(const char *msg, int index)
-{
-#if DEBUG_FBO
- _mesa_debug(NULL, "FBO Incomplete: %s [%d]\n", msg, index);
-#else
- (void) msg;
- (void) index;
-#endif
-}
-
-
-/**
- * Is the given base format a legal format for a color renderbuffer?
- */
-GLboolean
-_mesa_is_legal_color_format(const struct gl_context *ctx, GLenum baseFormat)
-{
- switch (baseFormat) {
- case GL_RGB:
- case GL_RGBA:
- return GL_TRUE;
- case GL_LUMINANCE:
- case GL_LUMINANCE_ALPHA:
- case GL_INTENSITY:
- case GL_ALPHA:
- return ctx->Extensions.ARB_framebuffer_object;
- case GL_RED:
- case GL_RG:
- return ctx->Extensions.ARB_texture_rg;
- default:
- return GL_FALSE;
- }
-}
-
-
-/**
- * Is the given base format a legal format for a depth/stencil renderbuffer?
- */
-static GLboolean
-is_legal_depth_format(const struct gl_context *ctx, GLenum baseFormat)
-{
- switch (baseFormat) {
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_EXT:
- return GL_TRUE;
- default:
- return GL_FALSE;
- }
-}
-
-
-/**
- * Test if an attachment point is complete and update its Complete field.
- * \param format if GL_COLOR, this is a color attachment point,
- * if GL_DEPTH, this is a depth component attachment point,
- * if GL_STENCIL, this is a stencil component attachment point.
- */
-static void
-test_attachment_completeness(const struct gl_context *ctx, GLenum format,
- struct gl_renderbuffer_attachment *att)
-{
- assert(format == GL_COLOR || format == GL_DEPTH || format == GL_STENCIL);
-
- /* assume complete */
- att->Complete = GL_TRUE;
-
- /* Look for reasons why the attachment might be incomplete */
- if (att->Type == GL_TEXTURE) {
- const struct gl_texture_object *texObj = att->Texture;
- struct gl_texture_image *texImage;
- GLenum baseFormat;
-
- if (!texObj) {
- att_incomplete("no texobj");
- att->Complete = GL_FALSE;
- return;
- }
-
- texImage = texObj->Image[att->CubeMapFace][att->TextureLevel];
- if (!texImage) {
- att_incomplete("no teximage");
- att->Complete = GL_FALSE;
- return;
- }
- if (texImage->Width < 1 || texImage->Height < 1) {
- att_incomplete("teximage width/height=0");
- printf("texobj = %u\n", texObj->Name);
- printf("level = %d\n", att->TextureLevel);
- att->Complete = GL_FALSE;
- return;
- }
- if (texObj->Target == GL_TEXTURE_3D && att->Zoffset >= texImage->Depth) {
- att_incomplete("bad z offset");
- att->Complete = GL_FALSE;
- return;
- }
-
- baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
-
- if (format == GL_COLOR) {
- if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
- att_incomplete("bad format");
- att->Complete = GL_FALSE;
- return;
- }
- if (_mesa_is_format_compressed(texImage->TexFormat)) {
- att_incomplete("compressed internalformat");
- att->Complete = GL_FALSE;
- return;
- }
- }
- else if (format == GL_DEPTH) {
- if (baseFormat == GL_DEPTH_COMPONENT) {
- /* OK */
- }
- else if (ctx->Extensions.EXT_packed_depth_stencil &&
- ctx->Extensions.ARB_depth_texture &&
- baseFormat == GL_DEPTH_STENCIL_EXT) {
- /* OK */
- }
- else {
- att->Complete = GL_FALSE;
- att_incomplete("bad depth format");
- return;
- }
- }
- else {
- ASSERT(format == GL_STENCIL);
- if (ctx->Extensions.EXT_packed_depth_stencil &&
- ctx->Extensions.ARB_depth_texture &&
- baseFormat == GL_DEPTH_STENCIL_EXT) {
- /* OK */
- }
- else {
- /* no such thing as stencil-only textures */
- att_incomplete("illegal stencil texture");
- att->Complete = GL_FALSE;
- return;
- }
- }
- }
- else if (att->Type == GL_RENDERBUFFER_EXT) {
- const GLenum baseFormat =
- _mesa_get_format_base_format(att->Renderbuffer->Format);
-
- ASSERT(att->Renderbuffer);
- if (!att->Renderbuffer->InternalFormat ||
- att->Renderbuffer->Width < 1 ||
- att->Renderbuffer->Height < 1) {
- att_incomplete("0x0 renderbuffer");
- att->Complete = GL_FALSE;
- return;
- }
- if (format == GL_COLOR) {
- if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
- att_incomplete("bad renderbuffer color format");
- att->Complete = GL_FALSE;
- return;
- }
- }
- else if (format == GL_DEPTH) {
- if (baseFormat == GL_DEPTH_COMPONENT) {
- /* OK */
- }
- else if (ctx->Extensions.EXT_packed_depth_stencil &&
- baseFormat == GL_DEPTH_STENCIL_EXT) {
- /* OK */
- }
- else {
- att_incomplete("bad renderbuffer depth format");
- att->Complete = GL_FALSE;
- return;
- }
- }
- else {
- assert(format == GL_STENCIL);
- if (baseFormat == GL_STENCIL_INDEX) {
- /* OK */
- }
- else if (ctx->Extensions.EXT_packed_depth_stencil &&
- baseFormat == GL_DEPTH_STENCIL_EXT) {
- /* OK */
- }
- else {
- att->Complete = GL_FALSE;
- att_incomplete("bad renderbuffer stencil format");
- return;
- }
- }
- }
- else {
- ASSERT(att->Type == GL_NONE);
- /* complete */
- return;
- }
-}
-
-
-/**
- * Test if the given framebuffer object is complete and update its
- * Status field with the results.
- * Calls the ctx->Driver.ValidateFramebuffer() function to allow the
- * driver to make hardware-specific validation/completeness checks.
- * Also update the framebuffer's Width and Height fields if the
- * framebuffer is complete.
- */
-void
-_mesa_test_framebuffer_completeness(struct gl_context *ctx,
- struct gl_framebuffer *fb)
-{
- GLuint numImages;
- GLenum intFormat = GL_NONE; /* color buffers' internal format */
- GLuint minWidth = ~0, minHeight = ~0, maxWidth = 0, maxHeight = 0;
- GLint numSamples = -1;
- GLint i;
- GLuint j;
-
- assert(fb->Name != 0);
-
- numImages = 0;
- fb->Width = 0;
- fb->Height = 0;
-
- /* Start at -2 to more easily loop over all attachment points.
- * -2: depth buffer
- * -1: stencil buffer
- * >=0: color buffer
- */
- for (i = -2; i < (GLint) ctx->Const.MaxColorAttachments; i++) {
- struct gl_renderbuffer_attachment *att;
- GLenum f;
- gl_format attFormat;
-
- /*
- * XXX for ARB_fbo, only check color buffers that are named by
- * GL_READ_BUFFER and GL_DRAW_BUFFERi.
- */
-
- /* check for attachment completeness
- */
- if (i == -2) {
- att = &fb->Attachment[BUFFER_DEPTH];
- test_attachment_completeness(ctx, GL_DEPTH, att);
- if (!att->Complete) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
- fbo_incomplete("depth attachment incomplete", -1);
- return;
- }
- }
- else if (i == -1) {
- att = &fb->Attachment[BUFFER_STENCIL];
- test_attachment_completeness(ctx, GL_STENCIL, att);
- if (!att->Complete) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
- fbo_incomplete("stencil attachment incomplete", -1);
- return;
- }
- }
- else {
- att = &fb->Attachment[BUFFER_COLOR0 + i];
- test_attachment_completeness(ctx, GL_COLOR, att);
- if (!att->Complete) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
- fbo_incomplete("color attachment incomplete", i);
- return;
- }
- }
-
- /* get width, height, format of the renderbuffer/texture
- */
- if (att->Type == GL_TEXTURE) {
- const struct gl_texture_image *texImg =
- _mesa_get_attachment_teximage(att);
- minWidth = MIN2(minWidth, texImg->Width);
- maxWidth = MAX2(maxWidth, texImg->Width);
- minHeight = MIN2(minHeight, texImg->Height);
- maxHeight = MAX2(maxHeight, texImg->Height);
- f = texImg->_BaseFormat;
- attFormat = texImg->TexFormat;
- numImages++;
- if (!_mesa_is_legal_color_format(ctx, f) &&
- !is_legal_depth_format(ctx, f)) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
- fbo_incomplete("texture attachment incomplete", -1);
- return;
- }
- }
- else if (att->Type == GL_RENDERBUFFER_EXT) {
- minWidth = MIN2(minWidth, att->Renderbuffer->Width);
- maxWidth = MAX2(minWidth, att->Renderbuffer->Width);
- minHeight = MIN2(minHeight, att->Renderbuffer->Height);
- maxHeight = MAX2(minHeight, att->Renderbuffer->Height);
- f = att->Renderbuffer->InternalFormat;
- attFormat = att->Renderbuffer->Format;
- numImages++;
- }
- else {
- assert(att->Type == GL_NONE);
- continue;
- }
-
- if (att->Renderbuffer && numSamples < 0) {
- /* first buffer */
- numSamples = att->Renderbuffer->NumSamples;
- }
-
- /* check if integer color */
- fb->_IntegerColor = _mesa_is_format_integer_color(attFormat);
-
- /* Error-check width, height, format, samples
- */
- if (numImages == 1) {
- /* save format, num samples */
- if (i >= 0) {
- intFormat = f;
- }
- }
- else {
- if (!ctx->Extensions.ARB_framebuffer_object) {
- /* check that width, height, format are same */
- if (minWidth != maxWidth || minHeight != maxHeight) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT;
- fbo_incomplete("width or height mismatch", -1);
- return;
- }
- /* check that all color buffer have same format */
- if (intFormat != GL_NONE && f != intFormat) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
- fbo_incomplete("format mismatch", -1);
- return;
- }
- }
- if (att->Renderbuffer &&
- att->Renderbuffer->NumSamples != numSamples) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
- fbo_incomplete("inconsistant number of samples", i);
- return;
- }
-
- }
- }
-
-#if FEATURE_GL
- if (ctx->API == API_OPENGL) {
- /* Check that all DrawBuffers are present */
- for (j = 0; j < ctx->Const.MaxDrawBuffers; j++) {
- if (fb->ColorDrawBuffer[j] != GL_NONE) {
- const struct gl_renderbuffer_attachment *att
- = _mesa_get_attachment(ctx, fb, fb->ColorDrawBuffer[j]);
- assert(att);
- if (att->Type == GL_NONE) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT;
- fbo_incomplete("missing drawbuffer", j);
- return;
- }
- }
- }
-
- /* Check that the ReadBuffer is present */
- if (fb->ColorReadBuffer != GL_NONE) {
- const struct gl_renderbuffer_attachment *att
- = _mesa_get_attachment(ctx, fb, fb->ColorReadBuffer);
- assert(att);
- if (att->Type == GL_NONE) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT;
- fbo_incomplete("missing readbuffer", -1);
- return;
- }
- }
- }
-#else
- (void) j;
-#endif
-
- if (numImages == 0) {
- fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT;
- fbo_incomplete("no attachments", -1);
- return;
- }
-
- /* Provisionally set status = COMPLETE ... */
- fb->_Status = GL_FRAMEBUFFER_COMPLETE_EXT;
-
- /* ... but the driver may say the FB is incomplete.
- * Drivers will most likely set the status to GL_FRAMEBUFFER_UNSUPPORTED
- * if anything.
- */
- if (ctx->Driver.ValidateFramebuffer) {
- ctx->Driver.ValidateFramebuffer(ctx, fb);
- if (fb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- fbo_incomplete("driver marked FBO as incomplete", -1);
- }
- }
-
- if (fb->_Status == GL_FRAMEBUFFER_COMPLETE_EXT) {
- /*
- * Note that if ARB_framebuffer_object is supported and the attached
- * renderbuffers/textures are different sizes, the framebuffer
- * width/height will be set to the smallest width/height.
- */
- fb->Width = minWidth;
- fb->Height = minHeight;
-
- /* finally, update the visual info for the framebuffer */
- _mesa_update_framebuffer_visual(ctx, fb);
- }
-}
-
-
-GLboolean GLAPIENTRY
-_mesa_IsRenderbufferEXT(GLuint renderbuffer)
-{
- GET_CURRENT_CONTEXT(ctx);
- ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
- if (renderbuffer) {
- struct gl_renderbuffer *rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
- if (rb != NULL && rb != &DummyRenderbuffer)
- return GL_TRUE;
- }
- return GL_FALSE;
-}
-
-
-void GLAPIENTRY
-_mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
-{
- struct gl_renderbuffer *newRb;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (target != GL_RENDERBUFFER_EXT) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBindRenderbufferEXT(target)");
- return;
- }
-
- /* No need to flush here since the render buffer binding has no
- * effect on rendering state.
- */
-
- if (renderbuffer) {
- newRb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
- if (newRb == &DummyRenderbuffer) {
- /* ID was reserved, but no real renderbuffer object made yet */
- newRb = NULL;
- }
- else if (!newRb && ctx->Extensions.ARB_framebuffer_object) {
- /* All RB IDs must be Gen'd */
- _mesa_error(ctx, GL_INVALID_OPERATION, "glBindRenderbuffer(buffer)");
- return;
- }
-
- if (!newRb) {
- /* create new renderbuffer object */
- newRb = ctx->Driver.NewRenderbuffer(ctx, renderbuffer);
- if (!newRb) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT");
- return;
- }
- ASSERT(newRb->AllocStorage);
- _mesa_HashInsert(ctx->Shared->RenderBuffers, renderbuffer, newRb);
- newRb->RefCount = 1; /* referenced by hash table */
- }
- }
- else {
- newRb = NULL;
- }
-
- ASSERT(newRb != &DummyRenderbuffer);
-
- _mesa_reference_renderbuffer(&ctx->CurrentRenderbuffer, newRb);
-}
-
-
-/**
- * If the given renderbuffer is anywhere attached to the framebuffer, detach
- * the renderbuffer.
- * This is used when a renderbuffer object is deleted.
- * The spec calls for unbinding.
- */
-static void
-detach_renderbuffer(struct gl_context *ctx,
- struct gl_framebuffer *fb,
- struct gl_renderbuffer *rb)
-{
- GLuint i;
- for (i = 0; i < BUFFER_COUNT; i++) {
- if (fb->Attachment[i].Renderbuffer == rb) {
- _mesa_remove_attachment(ctx, &fb->Attachment[i]);
- }
- }
- invalidate_framebuffer(fb);
-}
-
-
-void GLAPIENTRY
-_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
-{
- GLint i;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- for (i = 0; i < n; i++) {
- if (renderbuffers[i] > 0) {
- struct gl_renderbuffer *rb;
- rb = _mesa_lookup_renderbuffer(ctx, renderbuffers[i]);
- if (rb) {
- /* check if deleting currently bound renderbuffer object */
- if (rb == ctx->CurrentRenderbuffer) {
- /* bind default */
- ASSERT(rb->RefCount >= 2);
- _mesa_BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
- }
-
- if (ctx->DrawBuffer->Name) {
- detach_renderbuffer(ctx, ctx->DrawBuffer, rb);
- }
- if (ctx->ReadBuffer->Name && ctx->ReadBuffer != ctx->DrawBuffer) {
- detach_renderbuffer(ctx, ctx->ReadBuffer, rb);
- }
-
- /* Remove from hash table immediately, to free the ID.
- * But the object will not be freed until it's no longer
- * referenced anywhere else.
- */
- _mesa_HashRemove(ctx->Shared->RenderBuffers, renderbuffers[i]);
-
- if (rb != &DummyRenderbuffer) {
- /* no longer referenced by hash table */
- _mesa_reference_renderbuffer(&rb, NULL);
- }
- }
- }
- }
-}
-
-
-void GLAPIENTRY
-_mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
-{
- GET_CURRENT_CONTEXT(ctx);
- GLuint first;
- GLint i;
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (n < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glGenRenderbuffersEXT(n)");
- return;
- }
-
- if (!renderbuffers)
- return;
-
- first = _mesa_HashFindFreeKeyBlock(ctx->Shared->RenderBuffers, n);
-
- for (i = 0; i < n; i++) {
- GLuint name = first + i;
- renderbuffers[i] = name;
- /* insert dummy placeholder into hash table */
- _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
- _mesa_HashInsert(ctx->Shared->RenderBuffers, name, &DummyRenderbuffer);
- _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
- }
-}
-
-
-/**
- * Given an internal format token for a render buffer, return the
- * corresponding base format (one of GL_RGB, GL_RGBA, GL_STENCIL_INDEX,
- * GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL_EXT, GL_ALPHA, GL_LUMINANCE,
- * GL_LUMINANCE_ALPHA, GL_INTENSITY, etc).
- *
- * This is similar to _mesa_base_tex_format() but the set of valid
- * internal formats is different.
- *
- * Note that even if a format is determined to be legal here, validation
- * of the FBO may fail if the format is not supported by the driver/GPU.
- *
- * \param internalFormat as passed to glRenderbufferStorage()
- * \return the base internal format, or 0 if internalFormat is illegal
- */
-GLenum
-_mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
-{
- /*
- * Notes: some formats such as alpha, luminance, etc. were added
- * with GL_ARB_framebuffer_object.
- */
- switch (internalFormat) {
- case GL_ALPHA:
- case GL_ALPHA4:
- case GL_ALPHA8:
- case GL_ALPHA12:
- case GL_ALPHA16:
- return ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
- case GL_LUMINANCE:
- case GL_LUMINANCE4:
- case GL_LUMINANCE8:
- case GL_LUMINANCE12:
- case GL_LUMINANCE16:
- return ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE4_ALPHA4:
- case GL_LUMINANCE6_ALPHA2:
- case GL_LUMINANCE8_ALPHA8:
- case GL_LUMINANCE12_ALPHA4:
- case GL_LUMINANCE12_ALPHA12:
- case GL_LUMINANCE16_ALPHA16:
- return ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
- case GL_INTENSITY:
- case GL_INTENSITY4:
- case GL_INTENSITY8:
- case GL_INTENSITY12:
- case GL_INTENSITY16:
- return ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
- case GL_RGB:
- case GL_R3_G3_B2:
- case GL_RGB4:
- case GL_RGB5:
- case GL_RGB8:
- case GL_RGB10:
- case GL_RGB12:
- case GL_RGB16:
- case GL_SRGB8_EXT:
- return GL_RGB;
- case GL_RGBA:
- case GL_RGBA2:
- case GL_RGBA4:
- case GL_RGB5_A1:
- case GL_RGBA8:
- case GL_RGB10_A2:
- case GL_RGBA12:
- case GL_RGBA16:
- case GL_SRGB8_ALPHA8_EXT:
- return GL_RGBA;
- case GL_STENCIL_INDEX:
- case GL_STENCIL_INDEX1_EXT:
- case GL_STENCIL_INDEX4_EXT:
- case GL_STENCIL_INDEX8_EXT:
- case GL_STENCIL_INDEX16_EXT:
- return GL_STENCIL_INDEX;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT24:
- case GL_DEPTH_COMPONENT32:
- return GL_DEPTH_COMPONENT;
- case GL_DEPTH_STENCIL_EXT:
- case GL_DEPTH24_STENCIL8_EXT:
- if (ctx->Extensions.EXT_packed_depth_stencil)
- return GL_DEPTH_STENCIL_EXT;
- else
- return 0;
- case GL_RED:
- case GL_R8:
- case GL_R16:
- return ctx->Extensions.ARB_texture_rg ? GL_RED : 0;
- case GL_RG:
- case GL_RG8:
- case GL_RG16:
- return ctx->Extensions.ARB_texture_rg ? GL_RG : 0;
- /* signed normalized texture formats */
- case GL_RED_SNORM:
- case GL_R8_SNORM:
- case GL_R16_SNORM:
- return ctx->Extensions.EXT_texture_snorm ? GL_RED : 0;
- case GL_RG_SNORM:
- case GL_RG8_SNORM:
- case GL_RG16_SNORM:
- return ctx->Extensions.EXT_texture_snorm ? GL_RG : 0;
- case GL_RGB_SNORM:
- case GL_RGB8_SNORM:
- case GL_RGB16_SNORM:
- return ctx->Extensions.EXT_texture_snorm ? GL_RGB : 0;
- case GL_RGBA_SNORM:
- case GL_RGBA8_SNORM:
- case GL_RGBA16_SNORM:
- return ctx->Extensions.EXT_texture_snorm ? GL_RGBA : 0;
- case GL_ALPHA_SNORM:
- case GL_ALPHA8_SNORM:
- case GL_ALPHA16_SNORM:
- return ctx->Extensions.EXT_texture_snorm &&
- ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
- case GL_LUMINANCE_SNORM:
- case GL_LUMINANCE8_SNORM:
- case GL_LUMINANCE16_SNORM:
- return ctx->Extensions.EXT_texture_snorm &&
- ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
- case GL_LUMINANCE_ALPHA_SNORM:
- case GL_LUMINANCE8_ALPHA8_SNORM:
- case GL_LUMINANCE16_ALPHA16_SNORM:
- return ctx->Extensions.EXT_texture_snorm &&
- ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
- case GL_INTENSITY_SNORM:
- case GL_INTENSITY8_SNORM:
- case GL_INTENSITY16_SNORM:
- return ctx->Extensions.EXT_texture_snorm &&
- ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
- case GL_R16F:
- case GL_R32F:
- return ctx->Extensions.ARB_texture_rg &&
- ctx->Extensions.ARB_texture_float ? GL_RED : 0;
- case GL_RG16F:
- case GL_RG32F:
- return ctx->Extensions.ARB_texture_rg &&
- ctx->Extensions.ARB_texture_float ? GL_RG : 0;
- case GL_RGB16F:
- case GL_RGB32F:
- return ctx->Extensions.ARB_texture_float ? GL_RGB : 0;
- case GL_RGBA16F:
- case GL_RGBA32F:
- return ctx->Extensions.ARB_texture_float ? GL_RGBA : 0;
- case GL_ALPHA16F_ARB:
- case GL_ALPHA32F_ARB:
- return ctx->Extensions.ARB_texture_float &&
- ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
- case GL_LUMINANCE16F_ARB:
- case GL_LUMINANCE32F_ARB:
- return ctx->Extensions.ARB_texture_float &&
- ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
- case GL_LUMINANCE_ALPHA16F_ARB:
- case GL_LUMINANCE_ALPHA32F_ARB:
- return ctx->Extensions.ARB_texture_float &&
- ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
- case GL_INTENSITY16F_ARB:
- case GL_INTENSITY32F_ARB:
- return ctx->Extensions.ARB_texture_float &&
- ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
- case GL_RGB9_E5:
- return ctx->Extensions.EXT_texture_shared_exponent ? GL_RGB : 0;
- case GL_R11F_G11F_B10F:
- return ctx->Extensions.EXT_packed_float ? GL_RGB : 0;
- /* XXX add integer formats eventually */
- default:
- return 0;
- }
-}
-
-
-/**
- * Invalidate a renderbuffer attachment. Called from _mesa_HashWalk().
- */
-static void
-invalidate_rb(GLuint key, void *data, void *userData)
-{
- struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
- struct gl_renderbuffer *rb = (struct gl_renderbuffer *) userData;
-
- /* If this is a user-created FBO */
- if (fb->Name) {
- GLuint i;
- for (i = 0; i < BUFFER_COUNT; i++) {
- struct gl_renderbuffer_attachment *att = fb->Attachment + i;
- if (att->Type == GL_RENDERBUFFER &&
- att->Renderbuffer == rb) {
- /* Mark fb status as indeterminate to force re-validation */
- fb->_Status = 0;
- return;
- }
- }
- }
-}
-
-
-/** sentinal value, see below */
-#define NO_SAMPLES 1000
-
-
-/**
- * Helper function used by _mesa_RenderbufferStorageEXT() and
- * _mesa_RenderbufferStorageMultisample().
- * samples will be NO_SAMPLES if called by _mesa_RenderbufferStorageEXT().
- */
-static void
-renderbuffer_storage(GLenum target, GLenum internalFormat,
- GLsizei width, GLsizei height, GLsizei samples)
-{
- const char *func = samples == NO_SAMPLES ?
- "glRenderbufferStorage" : "RenderbufferStorageMultisample";
- struct gl_renderbuffer *rb;
- GLenum baseFormat;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (target != GL_RENDERBUFFER_EXT) {
- _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func);
- return;
- }
-
- baseFormat = _mesa_base_fbo_format(ctx, internalFormat);
- if (baseFormat == 0) {
- _mesa_error(ctx, GL_INVALID_ENUM, "%s(internalFormat)", func);
- return;
- }
-
- if (width < 1 || width > (GLsizei) ctx->Const.MaxRenderbufferSize) {
- _mesa_error(ctx, GL_INVALID_VALUE, "%s(width)", func);
- return;
- }
-
- if (height < 1 || height > (GLsizei) ctx->Const.MaxRenderbufferSize) {
- _mesa_error(ctx, GL_INVALID_VALUE, "%s(height)", func);
- return;
- }
-
- if (samples == NO_SAMPLES) {
- /* NumSamples == 0 indicates non-multisampling */
- samples = 0;
- }
- else if (samples > (GLsizei) ctx->Const.MaxSamples) {
- /* note: driver may choose to use more samples than what's requested */
- _mesa_error(ctx, GL_INVALID_VALUE, "%s(samples)", func);
- return;
- }
-
- rb = ctx->CurrentRenderbuffer;
- if (!rb) {
- _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
- return;
- }
-
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- if (rb->InternalFormat == internalFormat &&
- rb->Width == (GLuint) width &&
- rb->Height == (GLuint) height) {
- /* no change in allocation needed */
- return;
- }
-
- /* These MUST get set by the AllocStorage func */
- rb->Format = MESA_FORMAT_NONE;
- rb->NumSamples = samples;
-
- /* Now allocate the storage */
- ASSERT(rb->AllocStorage);
- if (rb->AllocStorage(ctx, rb, internalFormat, width, height)) {
- /* No error - check/set fields now */
- assert(rb->Format != MESA_FORMAT_NONE);
- assert(rb->Width == (GLuint) width);
- assert(rb->Height == (GLuint) height);
- rb->InternalFormat = internalFormat;
- rb->_BaseFormat = baseFormat;
- assert(rb->_BaseFormat != 0);
- }
- else {
- /* Probably ran out of memory - clear the fields */
- rb->Width = 0;
- rb->Height = 0;
- rb->Format = MESA_FORMAT_NONE;
- rb->InternalFormat = GL_NONE;
- rb->_BaseFormat = GL_NONE;
- rb->NumSamples = 0;
- }
-
- /* Invalidate the framebuffers the renderbuffer is attached in. */
- if (rb->AttachedAnytime) {
- _mesa_HashWalk(ctx->Shared->FrameBuffers, invalidate_rb, rb);
- }
-}
-
-
-#if FEATURE_OES_EGL_image
-void GLAPIENTRY
-_mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
-{
- struct gl_renderbuffer *rb;
- GET_CURRENT_CONTEXT(ctx);
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (!ctx->Extensions.OES_EGL_image) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glEGLImageTargetRenderbufferStorageOES(unsupported)");
- return;
- }
-
- if (target != GL_RENDERBUFFER) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "EGLImageTargetRenderbufferStorageOES");
- return;
- }
-
- rb = ctx->CurrentRenderbuffer;
- if (!rb) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "EGLImageTargetRenderbufferStorageOES");
- return;
- }
-
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- ctx->Driver.EGLImageTargetRenderbufferStorage(ctx, rb, image);
-}
-#endif
-
-
-/**
- * Helper function for _mesa_GetRenderbufferParameterivEXT() and
- * _mesa_GetFramebufferAttachmentParameterivEXT()
- * We have to be careful to respect the base format. For example, if a
- * renderbuffer/texture was created with internalFormat=GL_RGB but the
- * driver actually chose a GL_RGBA format, when the user queries ALPHA_SIZE
- * we need to return zero.
- */
-static GLint
-get_component_bits(GLenum pname, GLenum baseFormat, gl_format format)
-{
- switch (pname) {
- case GL_RENDERBUFFER_RED_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
- if (baseFormat == GL_RGB || baseFormat == GL_RGBA ||
- baseFormat == GL_RG || baseFormat == GL_RED)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- case GL_RENDERBUFFER_GREEN_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
- if (baseFormat == GL_RGB || baseFormat == GL_RGBA || baseFormat == GL_RG)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- case GL_RENDERBUFFER_BLUE_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
- if (baseFormat == GL_RGB || baseFormat == GL_RGBA)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
- if (baseFormat == GL_RGBA || baseFormat == GL_ALPHA ||
- baseFormat == GL_LUMINANCE_ALPHA)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
- if (baseFormat == GL_DEPTH_COMPONENT || baseFormat == GL_DEPTH_STENCIL)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
- case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
- if (baseFormat == GL_STENCIL_INDEX || baseFormat == GL_DEPTH_STENCIL)
- return _mesa_get_format_bits(format, pname);
- else
- return 0;
- default:
- return 0;
- }
-}
-
-
-
-void GLAPIENTRY
-_mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
- GLsizei width, GLsizei height)
-{
- /* GL_ARB_fbo says calling this function is equivalent to calling
- * glRenderbufferStorageMultisample() with samples=0. We pass in
- * a token value here just for error reporting purposes.
- */
- renderbuffer_storage(target, internalFormat, width, height, NO_SAMPLES);
-}
-
-
-void GLAPIENTRY
-_mesa_RenderbufferStorageMultisample(GLenum target, GLsizei samples,
- GLenum internalFormat,
- GLsizei width, GLsizei height)
-{
- renderbuffer_storage(target, internalFormat, width, height, samples);
-}
-
-
-/**
- * OpenGL ES version of glRenderBufferStorage.
- */
-void GLAPIENTRY
-_es_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
- GLsizei width, GLsizei height)
-{
- switch (internalFormat) {
- case GL_RGB565:
- /* XXX this confuses GL_RENDERBUFFER_INTERNAL_FORMAT_OES */
- /* choose a closest format */
- internalFormat = GL_RGB5;
- break;
- default:
- break;
- }
-
- renderbuffer_storage(target, internalFormat, width, height, 0);
-}
-
-
-void GLAPIENTRY
-_mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
-{
- struct gl_renderbuffer *rb;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (target != GL_RENDERBUFFER_EXT) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetRenderbufferParameterivEXT(target)");
- return;
- }
-
- rb = ctx->CurrentRenderbuffer;
- if (!rb) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetRenderbufferParameterivEXT");
- return;
- }
-
- /* No need to flush here since we're just quering state which is
- * not effected by rendering.
- */
-
- switch (pname) {
- case GL_RENDERBUFFER_WIDTH_EXT:
- *params = rb->Width;
- return;
- case GL_RENDERBUFFER_HEIGHT_EXT:
- *params = rb->Height;
- return;
- case GL_RENDERBUFFER_INTERNAL_FORMAT_EXT:
- *params = rb->InternalFormat;
- return;
- case GL_RENDERBUFFER_RED_SIZE_EXT:
- case GL_RENDERBUFFER_GREEN_SIZE_EXT:
- case GL_RENDERBUFFER_BLUE_SIZE_EXT:
- case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
- case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
- case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
- *params = get_component_bits(pname, rb->_BaseFormat, rb->Format);
- break;
- case GL_RENDERBUFFER_SAMPLES:
- if (ctx->Extensions.ARB_framebuffer_object) {
- *params = rb->NumSamples;
- break;
- }
- /* fallthrough */
- default:
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetRenderbufferParameterivEXT(target)");
- return;
- }
-}
-
-
-GLboolean GLAPIENTRY
-_mesa_IsFramebufferEXT(GLuint framebuffer)
-{
- GET_CURRENT_CONTEXT(ctx);
- ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
- if (framebuffer) {
- struct gl_framebuffer *rb = _mesa_lookup_framebuffer(ctx, framebuffer);
- if (rb != NULL && rb != &DummyFramebuffer)
- return GL_TRUE;
- }
- return GL_FALSE;
-}
-
-
-/**
- * Check if any of the attachments of the given framebuffer are textures
- * (render to texture). Call ctx->Driver.RenderTexture() for such
- * attachments.
- */
-static void
-check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
-{
- GLuint i;
- ASSERT(ctx->Driver.RenderTexture);
-
- if (fb->Name == 0)
- return; /* can't render to texture with winsys framebuffers */
-
- for (i = 0; i < BUFFER_COUNT; i++) {
- struct gl_renderbuffer_attachment *att = fb->Attachment + i;
- if (att->Texture && _mesa_get_attachment_teximage(att)) {
- ctx->Driver.RenderTexture(ctx, fb, att);
- }
- }
-}
-
-
-/**
- * Examine all the framebuffer's attachments to see if any are textures.
- * If so, call ctx->Driver.FinishRenderTexture() for each texture to
- * notify the device driver that the texture image may have changed.
- */
-static void
-check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
-{
- if (fb->Name == 0)
- return; /* can't render to texture with winsys framebuffers */
-
- if (ctx->Driver.FinishRenderTexture) {
- GLuint i;
- for (i = 0; i < BUFFER_COUNT; i++) {
- struct gl_renderbuffer_attachment *att = fb->Attachment + i;
- if (att->Texture && att->Renderbuffer) {
- ctx->Driver.FinishRenderTexture(ctx, att);
- }
- }
- }
-}
-
-
-void GLAPIENTRY
-_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
-{
- struct gl_framebuffer *newDrawFb, *newReadFb;
- struct gl_framebuffer *oldDrawFb, *oldReadFb;
- GLboolean bindReadBuf, bindDrawBuf;
- GET_CURRENT_CONTEXT(ctx);
-
-#ifdef DEBUG
- if (ctx->Extensions.ARB_framebuffer_object) {
- ASSERT(ctx->Extensions.EXT_framebuffer_object);
- ASSERT(ctx->Extensions.EXT_framebuffer_blit);
- }
-#endif
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (!ctx->Extensions.EXT_framebuffer_object) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBindFramebufferEXT(unsupported)");
- return;
- }
-
- switch (target) {
-#if FEATURE_EXT_framebuffer_blit
- case GL_DRAW_FRAMEBUFFER_EXT:
- if (!ctx->Extensions.EXT_framebuffer_blit) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
- return;
- }
- bindDrawBuf = GL_TRUE;
- bindReadBuf = GL_FALSE;
- break;
- case GL_READ_FRAMEBUFFER_EXT:
- if (!ctx->Extensions.EXT_framebuffer_blit) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
- return;
- }
- bindDrawBuf = GL_FALSE;
- bindReadBuf = GL_TRUE;
- break;
-#endif
- case GL_FRAMEBUFFER_EXT:
- bindDrawBuf = GL_TRUE;
- bindReadBuf = GL_TRUE;
- break;
- default:
- _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
- return;
- }
-
- if (framebuffer) {
- /* Binding a user-created framebuffer object */
- newDrawFb = _mesa_lookup_framebuffer(ctx, framebuffer);
- if (newDrawFb == &DummyFramebuffer) {
- /* ID was reserved, but no real framebuffer object made yet */
- newDrawFb = NULL;
- }
- else if (!newDrawFb && ctx->Extensions.ARB_framebuffer_object) {
- /* All FBO IDs must be Gen'd */
- _mesa_error(ctx, GL_INVALID_OPERATION, "glBindFramebuffer(buffer)");
- return;
- }
-
- if (!newDrawFb) {
- /* create new framebuffer object */
- newDrawFb = ctx->Driver.NewFramebuffer(ctx, framebuffer);
- if (!newDrawFb) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindFramebufferEXT");
- return;
- }
- _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newDrawFb);
- }
- newReadFb = newDrawFb;
- }
- else {
- /* Binding the window system framebuffer (which was originally set
- * with MakeCurrent).
- */
- newDrawFb = ctx->WinSysDrawBuffer;
- newReadFb = ctx->WinSysReadBuffer;
- }
-
- ASSERT(newDrawFb);
- ASSERT(newDrawFb != &DummyFramebuffer);
-
- /* save pointers to current/old framebuffers */
- oldDrawFb = ctx->DrawBuffer;
- oldReadFb = ctx->ReadBuffer;
-
- /* check if really changing bindings */
- if (oldDrawFb == newDrawFb)
- bindDrawBuf = GL_FALSE;
- if (oldReadFb == newReadFb)
- bindReadBuf = GL_FALSE;
-
- /*
- * OK, now bind the new Draw/Read framebuffers, if they're changing.
- *
- * We also check if we're beginning and/or ending render-to-texture.
- * When a framebuffer with texture attachments is unbound, call
- * ctx->Driver.FinishRenderTexture().
- * When a framebuffer with texture attachments is bound, call
- * ctx->Driver.RenderTexture().
- *
- * Note that if the ReadBuffer has texture attachments we don't consider
- * that a render-to-texture case.
- */
- if (bindReadBuf) {
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- /* check if old readbuffer was render-to-texture */
- check_end_texture_render(ctx, oldReadFb);
-
- _mesa_reference_framebuffer(&ctx->ReadBuffer, newReadFb);
- }
-
- if (bindDrawBuf) {
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- /* check if old read/draw buffers were render-to-texture */
- if (!bindReadBuf)
- check_end_texture_render(ctx, oldReadFb);
-
- if (oldDrawFb != oldReadFb)
- check_end_texture_render(ctx, oldDrawFb);
-
- /* check if newly bound framebuffer has any texture attachments */
- check_begin_texture_render(ctx, newDrawFb);
-
- _mesa_reference_framebuffer(&ctx->DrawBuffer, newDrawFb);
- }
-
- if ((bindDrawBuf || bindReadBuf) && ctx->Driver.BindFramebuffer) {
- ctx->Driver.BindFramebuffer(ctx, target, newDrawFb, newReadFb);
- }
-}
-
-
-void GLAPIENTRY
-_mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
-{
- GLint i;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- for (i = 0; i < n; i++) {
- if (framebuffers[i] > 0) {
- struct gl_framebuffer *fb;
- fb = _mesa_lookup_framebuffer(ctx, framebuffers[i]);
- if (fb) {
- ASSERT(fb == &DummyFramebuffer || fb->Name == framebuffers[i]);
-
- /* check if deleting currently bound framebuffer object */
- if (ctx->Extensions.EXT_framebuffer_blit) {
- /* separate draw/read binding points */
- if (fb == ctx->DrawBuffer) {
- /* bind default */
- ASSERT(fb->RefCount >= 2);
- _mesa_BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
- }
- if (fb == ctx->ReadBuffer) {
- /* bind default */
- ASSERT(fb->RefCount >= 2);
- _mesa_BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
- }
- }
- else {
- /* only one binding point for read/draw buffers */
- if (fb == ctx->DrawBuffer || fb == ctx->ReadBuffer) {
- /* bind default */
- ASSERT(fb->RefCount >= 2);
- _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- }
- }
-
- /* remove from hash table immediately, to free the ID */
- _mesa_HashRemove(ctx->Shared->FrameBuffers, framebuffers[i]);
-
- if (fb != &DummyFramebuffer) {
- /* But the object will not be freed until it's no longer
- * bound in any context.
- */
- _mesa_reference_framebuffer(&fb, NULL);
- }
- }
- }
- }
-}
-
-
-void GLAPIENTRY
-_mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
-{
- GET_CURRENT_CONTEXT(ctx);
- GLuint first;
- GLint i;
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- if (n < 0) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glGenFramebuffersEXT(n)");
- return;
- }
-
- if (!framebuffers)
- return;
-
- first = _mesa_HashFindFreeKeyBlock(ctx->Shared->FrameBuffers, n);
-
- for (i = 0; i < n; i++) {
- GLuint name = first + i;
- framebuffers[i] = name;
- /* insert dummy placeholder into hash table */
- _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
- _mesa_HashInsert(ctx->Shared->FrameBuffers, name, &DummyFramebuffer);
- _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
- }
-}
-
-
-
-GLenum GLAPIENTRY
-_mesa_CheckFramebufferStatusEXT(GLenum target)
-{
- struct gl_framebuffer *buffer;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
-
- buffer = get_framebuffer_target(ctx, target);
- if (!buffer) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glCheckFramebufferStatus(target)");
- return 0;
- }
-
- if (buffer->Name == 0) {
- /* The window system / default framebuffer is always complete */
- return GL_FRAMEBUFFER_COMPLETE_EXT;
- }
-
- /* No need to flush here */
-
- if (buffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
- _mesa_test_framebuffer_completeness(ctx, buffer);
- }
-
- return buffer->_Status;
-}
-
-
-
-/**
- * Common code called by glFramebufferTexture1D/2D/3DEXT().
- */
-static void
-framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target,
- GLenum attachment, GLenum textarget, GLuint texture,
- GLint level, GLint zoffset)
-{
- struct gl_renderbuffer_attachment *att;
- struct gl_texture_object *texObj = NULL;
- struct gl_framebuffer *fb;
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- fb = get_framebuffer_target(ctx, target);
- if (!fb) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferTexture%sEXT(target=0x%x)", caller, target);
- return;
- }
-
- /* check framebuffer binding */
- if (fb->Name == 0) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTexture%sEXT", caller);
- return;
- }
-
-
- /* The textarget, level, and zoffset parameters are only validated if
- * texture is non-zero.
- */
- if (texture) {
- GLboolean err = GL_TRUE;
-
- texObj = _mesa_lookup_texture(ctx, texture);
- if (texObj != NULL) {
- if (textarget == 0) {
- /* XXX what's the purpose of this? */
- err = (texObj->Target != GL_TEXTURE_3D) &&
- (texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) &&
- (texObj->Target != GL_TEXTURE_2D_ARRAY_EXT);
- }
- else {
- err = (texObj->Target == GL_TEXTURE_CUBE_MAP)
- ? !IS_CUBE_FACE(textarget)
- : (texObj->Target != textarget);
- }
- }
- else {
- /* can't render to a non-existant texture */
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTexture%sEXT(non existant texture)",
- caller);
- return;
- }
-
- if (err) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTexture%sEXT(texture target mismatch)",
- caller);
- return;
- }
-
- if (texObj->Target == GL_TEXTURE_3D) {
- const GLint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
- if (zoffset < 0 || zoffset >= maxSize) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "glFramebufferTexture%sEXT(zoffset)", caller);
- return;
- }
- }
- else if ((texObj->Target == GL_TEXTURE_1D_ARRAY_EXT) ||
- (texObj->Target == GL_TEXTURE_2D_ARRAY_EXT)) {
- if (zoffset < 0 || zoffset >= ctx->Const.MaxArrayTextureLayers) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "glFramebufferTexture%sEXT(layer)", caller);
- return;
- }
- }
-
- if ((level < 0) ||
- (level >= _mesa_max_texture_levels(ctx, texObj->Target))) {
- _mesa_error(ctx, GL_INVALID_VALUE,
- "glFramebufferTexture%sEXT(level)", caller);
- return;
- }
- }
-
- att = _mesa_get_attachment(ctx, fb, attachment);
- if (att == NULL) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferTexture%sEXT(attachment)", caller);
- return;
- }
-
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- _glthread_LOCK_MUTEX(fb->Mutex);
- if (texObj) {
- _mesa_set_texture_attachment(ctx, fb, att, texObj, textarget,
- level, zoffset);
- /* Set the render-to-texture flag. We'll check this flag in
- * glTexImage() and friends to determine if we need to revalidate
- * any FBOs that might be rendering into this texture.
- * This flag never gets cleared since it's non-trivial to determine
- * when all FBOs might be done rendering to this texture. That's OK
- * though since it's uncommon to render to a texture then repeatedly
- * call glTexImage() to change images in the texture.
- */
- texObj->_RenderToTexture = GL_TRUE;
- }
- else {
- _mesa_remove_attachment(ctx, att);
- }
-
- invalidate_framebuffer(fb);
-
- _glthread_UNLOCK_MUTEX(fb->Mutex);
-}
-
-
-
-void GLAPIENTRY
-_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture, GLint level)
-{
- GET_CURRENT_CONTEXT(ctx);
-
- if ((texture != 0) && (textarget != GL_TEXTURE_1D)) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferTexture1DEXT(textarget)");
- return;
- }
-
- framebuffer_texture(ctx, "1D", target, attachment, textarget, texture,
- level, 0);
-}
-
-
-void GLAPIENTRY
-_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture, GLint level)
-{
- GET_CURRENT_CONTEXT(ctx);
-
- if ((texture != 0) &&
- (textarget != GL_TEXTURE_2D) &&
- (textarget != GL_TEXTURE_RECTANGLE_ARB) &&
- (!IS_CUBE_FACE(textarget))) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTexture2DEXT(textarget=0x%x)", textarget);
- return;
- }
-
- framebuffer_texture(ctx, "2D", target, attachment, textarget, texture,
- level, 0);
-}
-
-
-void GLAPIENTRY
-_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture,
- GLint level, GLint zoffset)
-{
- GET_CURRENT_CONTEXT(ctx);
-
- if ((texture != 0) && (textarget != GL_TEXTURE_3D)) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferTexture3DEXT(textarget)");
- return;
- }
-
- framebuffer_texture(ctx, "3D", target, attachment, textarget, texture,
- level, zoffset);
-}
-
-
-void GLAPIENTRY
-_mesa_FramebufferTextureLayerEXT(GLenum target, GLenum attachment,
- GLuint texture, GLint level, GLint layer)
-{
- GET_CURRENT_CONTEXT(ctx);
-
- framebuffer_texture(ctx, "Layer", target, attachment, 0, texture,
- level, layer);
-}
-
-
-void GLAPIENTRY
-_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
- GLenum renderbufferTarget,
- GLuint renderbuffer)
-{
- struct gl_renderbuffer_attachment *att;
- struct gl_framebuffer *fb;
- struct gl_renderbuffer *rb;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- fb = get_framebuffer_target(ctx, target);
- if (!fb) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glFramebufferRenderbufferEXT(target)");
- return;
- }
-
- if (renderbufferTarget != GL_RENDERBUFFER_EXT) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferRenderbufferEXT(renderbufferTarget)");
- return;
- }
-
- if (fb->Name == 0) {
- /* Can't attach new renderbuffers to a window system framebuffer */
- _mesa_error(ctx, GL_INVALID_OPERATION, "glFramebufferRenderbufferEXT");
- return;
- }
-
- att = _mesa_get_attachment(ctx, fb, attachment);
- if (att == NULL) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glFramebufferRenderbufferEXT(invalid attachment %s)",
- _mesa_lookup_enum_by_nr(attachment));
- return;
- }
-
- if (renderbuffer) {
- rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
- if (!rb) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferRenderbufferEXT(non-existant"
- " renderbuffer %u)", renderbuffer);
- return;
- }
- else if (rb == &DummyRenderbuffer) {
- /* This is what NVIDIA does */
- _mesa_error(ctx, GL_INVALID_VALUE,
- "glFramebufferRenderbufferEXT(renderbuffer %u)",
- renderbuffer);
- return;
- }
- }
- else {
- /* remove renderbuffer attachment */
- rb = NULL;
- }
-
- if (attachment == GL_DEPTH_STENCIL_ATTACHMENT &&
- rb && rb->Format != MESA_FORMAT_NONE) {
- /* make sure the renderbuffer is a depth/stencil format */
- const GLenum baseFormat = _mesa_get_format_base_format(rb->Format);
- if (baseFormat != GL_DEPTH_STENCIL) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferRenderbufferEXT(renderbuffer"
- " is not DEPTH_STENCIL format)");
- return;
- }
- }
-
-
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- assert(ctx->Driver.FramebufferRenderbuffer);
- ctx->Driver.FramebufferRenderbuffer(ctx, fb, attachment, rb);
-
- /* Some subsequent GL commands may depend on the framebuffer's visual
- * after the binding is updated. Update visual info now.
- */
- _mesa_update_framebuffer_visual(ctx, fb);
-}
-
-
-void GLAPIENTRY
-_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
- GLenum pname, GLint *params)
-{
- const struct gl_renderbuffer_attachment *att;
- struct gl_framebuffer *buffer;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
-
- buffer = get_framebuffer_target(ctx, target);
- if (!buffer) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(target)");
- return;
- }
-
- if (buffer->Name == 0) {
- /* the default / window-system FBO */
- att = _mesa_get_fb0_attachment(ctx, buffer, attachment);
- }
- else {
- /* user-created framebuffer FBO */
- att = _mesa_get_attachment(ctx, buffer, attachment);
- }
-
- if (att == NULL) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(attachment)");
- return;
- }
-
- if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
- /* the depth and stencil attachments must point to the same buffer */
- const struct gl_renderbuffer_attachment *depthAtt, *stencilAtt;
- depthAtt = _mesa_get_attachment(ctx, buffer, GL_DEPTH_ATTACHMENT);
- stencilAtt = _mesa_get_attachment(ctx, buffer, GL_STENCIL_ATTACHMENT);
- if (depthAtt->Renderbuffer != stencilAtt->Renderbuffer) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glGetFramebufferAttachmentParameterivEXT(DEPTH/STENCIL"
- " attachments differ)");
- return;
- }
- }
-
- /* No need to flush here */
-
- switch (pname) {
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
- *params = buffer->Name == 0 ? GL_FRAMEBUFFER_DEFAULT : att->Type;
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
- if (att->Type == GL_RENDERBUFFER_EXT) {
- *params = att->Renderbuffer->Name;
- }
- else if (att->Type == GL_TEXTURE) {
- *params = att->Texture->Name;
- }
- else {
- assert(att->Type == GL_NONE);
- *params = 0;
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
- if (att->Type == GL_TEXTURE) {
- *params = att->TextureLevel;
- }
- else {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
- if (att->Type == GL_TEXTURE) {
- if (att->Texture && att->Texture->Target == GL_TEXTURE_CUBE_MAP) {
- *params = GL_TEXTURE_CUBE_MAP_POSITIVE_X + att->CubeMapFace;
- }
- else {
- *params = 0;
- }
- }
- else {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
- if (att->Type == GL_TEXTURE) {
- if (att->Texture && att->Texture->Target == GL_TEXTURE_3D) {
- *params = att->Zoffset;
- }
- else {
- *params = 0;
- }
- }
- else {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
- if (!ctx->Extensions.ARB_framebuffer_object) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- }
- else {
- if (ctx->Extensions.EXT_framebuffer_sRGB && ctx->Const.sRGBCapable) {
- *params = _mesa_get_format_color_encoding(att->Renderbuffer->Format);
- }
- else {
- /* According to ARB_framebuffer_sRGB, we should return LINEAR
- * if the sRGB conversion is unsupported. */
- *params = GL_LINEAR;
- }
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
- if (!ctx->Extensions.ARB_framebuffer_object) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- return;
- }
- else {
- gl_format format = att->Renderbuffer->Format;
- if (format == MESA_FORMAT_CI8 || format == MESA_FORMAT_S8) {
- /* special cases */
- *params = GL_INDEX;
- }
- else {
- *params = _mesa_get_format_datatype(format);
- }
- }
- return;
- case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
- case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
- if (!ctx->Extensions.ARB_framebuffer_object) {
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- }
- else if (att->Texture) {
- const struct gl_texture_image *texImage =
- _mesa_select_tex_image(ctx, att->Texture, att->Texture->Target,
- att->TextureLevel);
- if (texImage) {
- *params = get_component_bits(pname, texImage->_BaseFormat,
- texImage->TexFormat);
- }
- else {
- *params = 0;
- }
- }
- else if (att->Renderbuffer) {
- *params = get_component_bits(pname, att->Renderbuffer->_BaseFormat,
- att->Renderbuffer->Format);
- }
- else {
- *params = 0;
- }
- return;
- default:
- _mesa_error(ctx, GL_INVALID_ENUM,
- "glGetFramebufferAttachmentParameterivEXT(pname)");
- return;
- }
-}
-
-
-void GLAPIENTRY
-_mesa_GenerateMipmapEXT(GLenum target)
-{
- struct gl_texture_object *texObj;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- switch (target) {
- case GL_TEXTURE_1D:
- case GL_TEXTURE_2D:
- case GL_TEXTURE_3D:
- case GL_TEXTURE_CUBE_MAP:
- /* OK, legal value */
- break;
- default:
- /* XXX need to implement GL_TEXTURE_1D_ARRAY and GL_TEXTURE_2D_ARRAY */
- _mesa_error(ctx, GL_INVALID_ENUM, "glGenerateMipmapEXT(target)");
- return;
- }
-
- texObj = _mesa_get_current_tex_object(ctx, target);
-
- if (texObj->BaseLevel >= texObj->MaxLevel) {
- /* nothing to do */
- return;
- }
-
- if (texObj->Target == GL_TEXTURE_CUBE_MAP &&
- !_mesa_cube_complete(texObj)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glGenerateMipmap(incomplete cube map)");
- return;
- }
-
- _mesa_lock_texture(ctx, texObj);
- if (target == GL_TEXTURE_CUBE_MAP) {
- GLuint face;
- for (face = 0; face < 6; face++)
- ctx->Driver.GenerateMipmap(ctx,
- GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + face,
- texObj);
- }
- else {
- ctx->Driver.GenerateMipmap(ctx, target, texObj);
- }
- _mesa_unlock_texture(ctx, texObj);
-}
-
-
-#if FEATURE_EXT_framebuffer_blit
-
-static const struct gl_renderbuffer_attachment *
-find_attachment(const struct gl_framebuffer *fb,
- const struct gl_renderbuffer *rb)
-{
- GLuint i;
- for (i = 0; i < Elements(fb->Attachment); i++) {
- if (fb->Attachment[i].Renderbuffer == rb)
- return &fb->Attachment[i];
- }
- return NULL;
-}
-
-
-
-/**
- * Blit rectangular region, optionally from one framebuffer to another.
- *
- * Note, if the src buffer is multisampled and the dest is not, this is
- * when the samples must be resolved to a single color.
- */
-void GLAPIENTRY
-_mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
- GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
- GLbitfield mask, GLenum filter)
-{
- const GLbitfield legalMaskBits = (GL_COLOR_BUFFER_BIT |
- GL_DEPTH_BUFFER_BIT |
- GL_STENCIL_BUFFER_BIT);
- const struct gl_framebuffer *readFb, *drawFb;
- const struct gl_renderbuffer *colorReadRb, *colorDrawRb;
- GET_CURRENT_CONTEXT(ctx);
-
- ASSERT_OUTSIDE_BEGIN_END(ctx);
- FLUSH_VERTICES(ctx, _NEW_BUFFERS);
-
- if (MESA_VERBOSE & VERBOSE_API)
- _mesa_debug(ctx,
- "glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d, 0x%x, %s)\n",
- srcX0, srcY0, srcX1, srcY1,
- dstX0, dstY0, dstX1, dstY1,
- mask, _mesa_lookup_enum_by_nr(filter));
-
- if (ctx->NewState) {
- _mesa_update_state(ctx);
- }
-
- readFb = ctx->ReadBuffer;
- drawFb = ctx->DrawBuffer;
-
- if (!readFb || !drawFb) {
- /* This will normally never happen but someday we may want to
- * support MakeCurrent() with no drawables.
- */
- return;
- }
-
- /* check for complete framebuffers */
- if (drawFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
- readFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
- _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
- "glBlitFramebufferEXT(incomplete draw/read buffers)");
- return;
- }
-
- if (filter != GL_NEAREST && filter != GL_LINEAR) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBlitFramebufferEXT(filter)");
- return;
- }
-
- if (mask & ~legalMaskBits) {
- _mesa_error( ctx, GL_INVALID_VALUE, "glBlitFramebufferEXT(mask)");
- return;
- }
-
- /* depth/stencil must be blitted with nearest filtering */
- if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
- && filter != GL_NEAREST) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(depth/stencil requires GL_NEAREST filter)");
- return;
- }
-
- /* get color read/draw renderbuffers */
- if (mask & GL_COLOR_BUFFER_BIT) {
- colorReadRb = readFb->_ColorReadBuffer;
- colorDrawRb = drawFb->_ColorDrawBuffers[0];
- }
- else {
- colorReadRb = colorDrawRb = NULL;
- }
-
- if (mask & GL_STENCIL_BUFFER_BIT) {
- struct gl_renderbuffer *readRb = readFb->_StencilBuffer;
- struct gl_renderbuffer *drawRb = drawFb->_StencilBuffer;
- if (!readRb ||
- !drawRb ||
- _mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) !=
- _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(stencil buffer size mismatch)");
- return;
- }
- }
-
- if (mask & GL_DEPTH_BUFFER_BIT) {
- struct gl_renderbuffer *readRb = readFb->_DepthBuffer;
- struct gl_renderbuffer *drawRb = drawFb->_DepthBuffer;
- if (!readRb ||
- !drawRb ||
- _mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS) !=
- _mesa_get_format_bits(drawRb->Format, GL_DEPTH_BITS)) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(depth buffer size mismatch)");
- return;
- }
- }
-
- if (readFb->Visual.samples > 0 &&
- drawFb->Visual.samples > 0 &&
- readFb->Visual.samples != drawFb->Visual.samples) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(mismatched samples");
- return;
- }
-
- /* extra checks for multisample copies... */
- if (readFb->Visual.samples > 0 || drawFb->Visual.samples > 0) {
- /* src and dest region sizes must be the same */
- if (srcX1 - srcX0 != dstX1 - dstX0 ||
- srcY1 - srcY0 != dstY1 - dstY0) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(bad src/dst multisample region sizes)");
- return;
- }
-
- /* color formats must match */
- if (colorReadRb &&
- colorDrawRb &&
- colorReadRb->Format != colorDrawRb->Format) {
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glBlitFramebufferEXT(bad src/dst multisample pixel formats)");
- return;
- }
- }
-
- if (!ctx->Extensions.EXT_framebuffer_blit) {
- _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebufferEXT");
- return;
- }
-
- /* Debug code */
- if (DEBUG_BLIT) {
- printf("glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d,"
- " 0x%x, 0x%x)\n",
- srcX0, srcY0, srcX1, srcY1,
- dstX0, dstY0, dstX1, dstY1,
- mask, filter);
- if (colorReadRb) {
- const struct gl_renderbuffer_attachment *att;
-
- att = find_attachment(readFb, colorReadRb);
- printf(" Src FBO %u RB %u (%dx%d) ",
- readFb->Name, colorReadRb->Name,
- colorReadRb->Width, colorReadRb->Height);
- if (att && att->Texture) {
- printf("Tex %u tgt 0x%x level %u face %u",
- att->Texture->Name,
- att->Texture->Target,
- att->TextureLevel,
- att->CubeMapFace);
- }
- printf("\n");
-
- att = find_attachment(drawFb, colorDrawRb);
- printf(" Dst FBO %u RB %u (%dx%d) ",
- drawFb->Name, colorDrawRb->Name,
- colorDrawRb->Width, colorDrawRb->Height);
- if (att && att->Texture) {
- printf("Tex %u tgt 0x%x level %u face %u",
- att->Texture->Name,
- att->Texture->Target,
- att->TextureLevel,
- att->CubeMapFace);
- }
- printf("\n");
- }
- }
-
- ASSERT(ctx->Driver.BlitFramebuffer);
- ctx->Driver.BlitFramebuffer(ctx,
- srcX0, srcY0, srcX1, srcY1,
- dstX0, dstY0, dstX1, dstY1,
- mask, filter);
-}
-#endif /* FEATURE_EXT_framebuffer_blit */
-
-#if FEATURE_ARB_geometry_shader4
-void GLAPIENTRY
-_mesa_FramebufferTextureARB(GLenum target, GLenum attachment,
- GLuint texture, GLint level)
-{
- GET_CURRENT_CONTEXT(ctx);
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTextureARB "
- "not implemented!");
-}
-
-void GLAPIENTRY
-_mesa_FramebufferTextureFaceARB(GLenum target, GLenum attachment,
- GLuint texture, GLint level, GLenum face)
-{
- GET_CURRENT_CONTEXT(ctx);
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glFramebufferTextureFaceARB "
- "not implemented!");
-}
-#endif /* FEATURE_ARB_geometry_shader4 */
+/*
+ * Mesa 3-D graphics library
+ * Version: 7.1
+ *
+ * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2009 VMware, Inc. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ * GL_EXT/ARB_framebuffer_object extensions
+ *
+ * Authors:
+ * Brian Paul
+ */
+
+
+#include "buffers.h"
+#include "context.h"
+#include "enums.h"
+#include "fbobject.h"
+#include "formats.h"
+#include "framebuffer.h"
+#include "hash.h"
+#include "macros.h"
+#include "mfeatures.h"
+#include "mtypes.h"
+#include "renderbuffer.h"
+#include "state.h"
+#include "teximage.h"
+#include "texobj.h"
+
+
+/** Set this to 1 to help debug FBO incompleteness problems */
+#define DEBUG_FBO 0
+
+/** Set this to 1 to debug/log glBlitFramebuffer() calls */
+#define DEBUG_BLIT 0
+
+
+/**
+ * Notes:
+ *
+ * None of the GL_EXT_framebuffer_object functions are compiled into
+ * display lists.
+ */
+
+
+
+/*
+ * When glGenRender/FramebuffersEXT() is called we insert pointers to
+ * these placeholder objects into the hash table.
+ * Later, when the object ID is first bound, we replace the placeholder
+ * with the real frame/renderbuffer.
+ */
+static struct gl_framebuffer DummyFramebuffer;
+static struct gl_renderbuffer DummyRenderbuffer;
+
+/* We bind this framebuffer when applications pass a NULL
+ * drawable/surface in make current. */
+static struct gl_framebuffer IncompleteFramebuffer;
+
+
+#define IS_CUBE_FACE(TARGET) \
+ ((TARGET) >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && \
+ (TARGET) <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
+
+
+static void
+delete_dummy_renderbuffer(struct gl_renderbuffer *rb)
+{
+ /* no op */
+}
+
+static void
+delete_dummy_framebuffer(struct gl_framebuffer *fb)
+{
+ /* no op */
+}
+
+
+void
+_mesa_init_fbobjects(struct gl_context *ctx)
+{
+ _glthread_INIT_MUTEX(DummyFramebuffer.Mutex);
+ _glthread_INIT_MUTEX(DummyRenderbuffer.Mutex);
+ _glthread_INIT_MUTEX(IncompleteFramebuffer.Mutex);
+ DummyFramebuffer.Delete = delete_dummy_framebuffer;
+ DummyRenderbuffer.Delete = delete_dummy_renderbuffer;
+ IncompleteFramebuffer.Delete = delete_dummy_framebuffer;
+}
+
+struct gl_framebuffer *
+_mesa_get_incomplete_framebuffer(void)
+{
+ return &IncompleteFramebuffer;
+}
+
+/**
+ * Helper routine for getting a gl_renderbuffer.
+ */
+struct gl_renderbuffer *
+_mesa_lookup_renderbuffer(struct gl_context *ctx, GLuint id)
+{
+ struct gl_renderbuffer *rb;
+
+ if (id == 0)
+ return NULL;
+
+ rb = (struct gl_renderbuffer *)
+ _mesa_HashLookup(ctx->Shared->RenderBuffers, id);
+ return rb;
+}
+
+
+/**
+ * Helper routine for getting a gl_framebuffer.
+ */
+struct gl_framebuffer *
+_mesa_lookup_framebuffer(struct gl_context *ctx, GLuint id)
+{
+ struct gl_framebuffer *fb;
+
+ if (id == 0)
+ return NULL;
+
+ fb = (struct gl_framebuffer *)
+ _mesa_HashLookup(ctx->Shared->FrameBuffers, id);
+ return fb;
+}
+
+
+/**
+ * Mark the given framebuffer as invalid. This will force the
+ * test for framebuffer completeness to be done before the framebuffer
+ * is used.
+ */
+static void
+invalidate_framebuffer(struct gl_framebuffer *fb)
+{
+ fb->_Status = 0; /* "indeterminate" */
+}
+
+
+/**
+ * Return the gl_framebuffer object which corresponds to the given
+ * framebuffer target, such as GL_DRAW_FRAMEBUFFER.
+ * Check support for GL_EXT_framebuffer_blit to determine if certain
+ * targets are legal.
+ * \return gl_framebuffer pointer or NULL if target is illegal
+ */
+static struct gl_framebuffer *
+get_framebuffer_target(struct gl_context *ctx, GLenum target)
+{
+ switch (target) {
+ case GL_DRAW_FRAMEBUFFER:
+ return ctx->Extensions.EXT_framebuffer_blit ? ctx->DrawBuffer : NULL;
+ case GL_READ_FRAMEBUFFER:
+ return ctx->Extensions.EXT_framebuffer_blit ? ctx->ReadBuffer : NULL;
+ case GL_FRAMEBUFFER_EXT:
+ return ctx->DrawBuffer;
+ default:
+ return NULL;
+ }
+}
+
+
+/**
+ * Given a GL_*_ATTACHMENTn token, return a pointer to the corresponding
+ * gl_renderbuffer_attachment object.
+ * This function is only used for user-created FB objects, not the
+ * default / window-system FB object.
+ * If \p attachment is GL_DEPTH_STENCIL_ATTACHMENT, return a pointer to
+ * the depth buffer attachment point.
+ */
+struct gl_renderbuffer_attachment *
+_mesa_get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
+ GLenum attachment)
+{
+ GLuint i;
+
+ assert(fb->Name > 0);
+
+ switch (attachment) {
+ case GL_COLOR_ATTACHMENT0_EXT:
+ case GL_COLOR_ATTACHMENT1_EXT:
+ case GL_COLOR_ATTACHMENT2_EXT:
+ case GL_COLOR_ATTACHMENT3_EXT:
+ case GL_COLOR_ATTACHMENT4_EXT:
+ case GL_COLOR_ATTACHMENT5_EXT:
+ case GL_COLOR_ATTACHMENT6_EXT:
+ case GL_COLOR_ATTACHMENT7_EXT:
+ case GL_COLOR_ATTACHMENT8_EXT:
+ case GL_COLOR_ATTACHMENT9_EXT:
+ case GL_COLOR_ATTACHMENT10_EXT:
+ case GL_COLOR_ATTACHMENT11_EXT:
+ case GL_COLOR_ATTACHMENT12_EXT:
+ case GL_COLOR_ATTACHMENT13_EXT:
+ case GL_COLOR_ATTACHMENT14_EXT:
+ case GL_COLOR_ATTACHMENT15_EXT:
+ i = attachment - GL_COLOR_ATTACHMENT0_EXT;
+ if (i >= ctx->Const.MaxColorAttachments) {
+ return NULL;
+ }
+ return &fb->Attachment[BUFFER_COLOR0 + i];
+ case GL_DEPTH_STENCIL_ATTACHMENT:
+ /* fall-through */
+ case GL_DEPTH_BUFFER:
+ /* fall-through / new in GL 3.0 */
+ case GL_DEPTH_ATTACHMENT_EXT:
+ return &fb->Attachment[BUFFER_DEPTH];
+ case GL_STENCIL_BUFFER:
+ /* fall-through / new in GL 3.0 */
+ case GL_STENCIL_ATTACHMENT_EXT:
+ return &fb->Attachment[BUFFER_STENCIL];
+ default:
+ return NULL;
+ }
+}
+
+
+/**
+ * As above, but only used for getting attachments of the default /
+ * window-system framebuffer (not user-created framebuffer objects).
+ */
+static struct gl_renderbuffer_attachment *
+_mesa_get_fb0_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
+ GLenum attachment)
+{
+ assert(fb->Name == 0);
+
+ switch (attachment) {
+ case GL_FRONT_LEFT:
+ return &fb->Attachment[BUFFER_FRONT_LEFT];
+ case GL_FRONT_RIGHT:
+ return &fb->Attachment[BUFFER_FRONT_RIGHT];
+ case GL_BACK_LEFT:
+ return &fb->Attachment[BUFFER_BACK_LEFT];
+ case GL_BACK_RIGHT:
+ return &fb->Attachment[BUFFER_BACK_RIGHT];
+ case GL_AUX0:
+ if (fb->Visual.numAuxBuffers == 1) {
+ return &fb->Attachment[BUFFER_AUX0];
+ }
+ return NULL;
+ case GL_DEPTH_BUFFER:
+ /* fall-through / new in GL 3.0 */
+ case GL_DEPTH_ATTACHMENT_EXT:
+ return &fb->Attachment[BUFFER_DEPTH];
+ case GL_STENCIL_BUFFER:
+ /* fall-through / new in GL 3.0 */
+ case GL_STENCIL_ATTACHMENT_EXT:
+ return &fb->Attachment[BUFFER_STENCIL];
+ default:
+ return NULL;
+ }
+}
+
+
+
+/**
+ * Remove any texture or renderbuffer attached to the given attachment
+ * point. Update reference counts, etc.
+ */
+void
+_mesa_remove_attachment(struct gl_context *ctx,
+ struct gl_renderbuffer_attachment *att)
+{
+ if (att->Type == GL_TEXTURE) {
+ ASSERT(att->Texture);
+ if (ctx->Driver.FinishRenderTexture) {
+ /* tell driver that we're done rendering to this texture. */
+ ctx->Driver.FinishRenderTexture(ctx, att);
+ }
+ _mesa_reference_texobj(&att->Texture, NULL); /* unbind */
+ ASSERT(!att->Texture);
+ }
+ if (att->Type == GL_TEXTURE || att->Type == GL_RENDERBUFFER_EXT) {
+ ASSERT(!att->Texture);
+ _mesa_reference_renderbuffer(&att->Renderbuffer, NULL); /* unbind */
+ ASSERT(!att->Renderbuffer);
+ }
+ att->Type = GL_NONE;
+ att->Complete = GL_TRUE;
+}
+
+
+/**
+ * Bind a texture object to an attachment point.
+ * The previous binding, if any, will be removed first.
+ */
+void
+_mesa_set_texture_attachment(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ struct gl_renderbuffer_attachment *att,
+ struct gl_texture_object *texObj,
+ GLenum texTarget, GLuint level, GLuint zoffset)
+{
+ if (att->Texture == texObj) {
+ /* re-attaching same texture */
+ ASSERT(att->Type == GL_TEXTURE);
+ if (ctx->Driver.FinishRenderTexture)
+ ctx->Driver.FinishRenderTexture(ctx, att);
+ }
+ else {
+ /* new attachment */
+ if (ctx->Driver.FinishRenderTexture && att->Texture)
+ ctx->Driver.FinishRenderTexture(ctx, att);
+ _mesa_remove_attachment(ctx, att);
+ att->Type = GL_TEXTURE;
+ assert(!att->Texture);
+ _mesa_reference_texobj(&att->Texture, texObj);
+ }
+
+ /* always update these fields */
+ att->TextureLevel = level;
+ att->CubeMapFace = _mesa_tex_target_to_face(texTarget);
+ att->Zoffset = zoffset;
+ att->Complete = GL_FALSE;
+
+ if (_mesa_get_attachment_teximage(att)) {
+ ctx->Driver.RenderTexture(ctx, fb, att);
+ }
+
+ invalidate_framebuffer(fb);
+}
+
+
+/**
+ * Bind a renderbuffer to an attachment point.
+ * The previous binding, if any, will be removed first.
+ */
+void
+_mesa_set_renderbuffer_attachment(struct gl_context *ctx,
+ struct gl_renderbuffer_attachment *att,
+ struct gl_renderbuffer *rb)
+{
+ /* XXX check if re-doing same attachment, exit early */
+ _mesa_remove_attachment(ctx, att);
+ att->Type = GL_RENDERBUFFER_EXT;
+ att->Texture = NULL; /* just to be safe */
+ att->Complete = GL_FALSE;
+ _mesa_reference_renderbuffer(&att->Renderbuffer, rb);
+}
+
+
+/**
+ * Fallback for ctx->Driver.FramebufferRenderbuffer()
+ * Attach a renderbuffer object to a framebuffer object.
+ */
+void
+_mesa_framebuffer_renderbuffer(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ GLenum attachment, struct gl_renderbuffer *rb)
+{
+ struct gl_renderbuffer_attachment *att;
+
+ _glthread_LOCK_MUTEX(fb->Mutex);
+
+ att = _mesa_get_attachment(ctx, fb, attachment);
+ ASSERT(att);
+ if (rb) {
+ _mesa_set_renderbuffer_attachment(ctx, att, rb);
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
+ /* do stencil attachment here (depth already done above) */
+ att = _mesa_get_attachment(ctx, fb, GL_STENCIL_ATTACHMENT_EXT);
+ assert(att);
+ _mesa_set_renderbuffer_attachment(ctx, att, rb);
+ }
+ rb->AttachedAnytime = GL_TRUE;
+ }
+ else {
+ _mesa_remove_attachment(ctx, att);
+ }
+
+ invalidate_framebuffer(fb);
+
+ _glthread_UNLOCK_MUTEX(fb->Mutex);
+}
+
+
+/**
+ * Fallback for ctx->Driver.ValidateFramebuffer()
+ * Check if the renderbuffer's formats are supported by the software
+ * renderer.
+ * Drivers should probably override this.
+ */
+void
+_mesa_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
+{
+ gl_buffer_index buf;
+ for (buf = 0; buf < BUFFER_COUNT; buf++) {
+ const struct gl_renderbuffer *rb = fb->Attachment[buf].Renderbuffer;
+ if (rb) {
+ switch (rb->_BaseFormat) {
+ case GL_ALPHA:
+ case GL_LUMINANCE_ALPHA:
+ case GL_LUMINANCE:
+ case GL_INTENSITY:
+ case GL_RED:
+ case GL_RG:
+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
+ return;
+
+ default:
+ switch (rb->Format) {
+ /* XXX This list is likely incomplete. */
+ case MESA_FORMAT_RGB9_E5_FLOAT:
+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;
+ return;
+ default:;
+ /* render buffer format is supported by software rendering */
+ }
+ }
+ }
+ }
+}
+
+
+/**
+ * For debug only.
+ */
+static void
+att_incomplete(const char *msg)
+{
+#if DEBUG_FBO
+ _mesa_debug(NULL, "attachment incomplete: %s\n", msg);
+#else
+ (void) msg;
+#endif
+}
+
+
+/**
+ * For debug only.
+ */
+static void
+fbo_incomplete(const char *msg, int index)
+{
+#if DEBUG_FBO
+ _mesa_debug(NULL, "FBO Incomplete: %s [%d]\n", msg, index);
+#else
+ (void) msg;
+ (void) index;
+#endif
+}
+
+
+/**
+ * Is the given base format a legal format for a color renderbuffer?
+ */
+GLboolean
+_mesa_is_legal_color_format(const struct gl_context *ctx, GLenum baseFormat)
+{
+ switch (baseFormat) {
+ case GL_RGB:
+ case GL_RGBA:
+ return GL_TRUE;
+ case GL_LUMINANCE:
+ case GL_LUMINANCE_ALPHA:
+ case GL_INTENSITY:
+ case GL_ALPHA:
+ return ctx->Extensions.ARB_framebuffer_object;
+ case GL_RED:
+ case GL_RG:
+ return ctx->Extensions.ARB_texture_rg;
+ default:
+ return GL_FALSE;
+ }
+}
+
+
+/**
+ * Is the given base format a legal format for a depth/stencil renderbuffer?
+ */
+static GLboolean
+is_legal_depth_format(const struct gl_context *ctx, GLenum baseFormat)
+{
+ switch (baseFormat) {
+ case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_STENCIL_EXT:
+ return GL_TRUE;
+ default:
+ return GL_FALSE;
+ }
+}
+
+
+/**
+ * Test if an attachment point is complete and update its Complete field.
+ * \param format if GL_COLOR, this is a color attachment point,
+ * if GL_DEPTH, this is a depth component attachment point,
+ * if GL_STENCIL, this is a stencil component attachment point.
+ */
+static void
+test_attachment_completeness(const struct gl_context *ctx, GLenum format,
+ struct gl_renderbuffer_attachment *att)
+{
+ assert(format == GL_COLOR || format == GL_DEPTH || format == GL_STENCIL);
+
+ /* assume complete */
+ att->Complete = GL_TRUE;
+
+ /* Look for reasons why the attachment might be incomplete */
+ if (att->Type == GL_TEXTURE) {
+ const struct gl_texture_object *texObj = att->Texture;
+ struct gl_texture_image *texImage;
+ GLenum baseFormat;
+
+ if (!texObj) {
+ att_incomplete("no texobj");
+ att->Complete = GL_FALSE;
+ return;
+ }
+
+ texImage = texObj->Image[att->CubeMapFace][att->TextureLevel];
+ if (!texImage) {
+ att_incomplete("no teximage");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ if (texImage->Width < 1 || texImage->Height < 1) {
+ att_incomplete("teximage width/height=0");
+ printf("texobj = %u\n", texObj->Name);
+ printf("level = %d\n", att->TextureLevel);
+ att->Complete = GL_FALSE;
+ return;
+ }
+ if (texObj->Target == GL_TEXTURE_3D && att->Zoffset >= texImage->Depth) {
+ att_incomplete("bad z offset");
+ att->Complete = GL_FALSE;
+ return;
+ }
+
+ baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
+
+ if (format == GL_COLOR) {
+ if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
+ att_incomplete("bad format");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ if (_mesa_is_format_compressed(texImage->TexFormat)) {
+ att_incomplete("compressed internalformat");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ }
+ else if (format == GL_DEPTH) {
+ if (baseFormat == GL_DEPTH_COMPONENT) {
+ /* OK */
+ }
+ else if (ctx->Extensions.EXT_packed_depth_stencil &&
+ ctx->Extensions.ARB_depth_texture &&
+ baseFormat == GL_DEPTH_STENCIL_EXT) {
+ /* OK */
+ }
+ else {
+ att->Complete = GL_FALSE;
+ att_incomplete("bad depth format");
+ return;
+ }
+ }
+ else {
+ ASSERT(format == GL_STENCIL);
+ if (ctx->Extensions.EXT_packed_depth_stencil &&
+ ctx->Extensions.ARB_depth_texture &&
+ baseFormat == GL_DEPTH_STENCIL_EXT) {
+ /* OK */
+ }
+ else {
+ /* no such thing as stencil-only textures */
+ att_incomplete("illegal stencil texture");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ }
+ }
+ else if (att->Type == GL_RENDERBUFFER_EXT) {
+ const GLenum baseFormat =
+ _mesa_get_format_base_format(att->Renderbuffer->Format);
+
+ ASSERT(att->Renderbuffer);
+ if (!att->Renderbuffer->InternalFormat ||
+ att->Renderbuffer->Width < 1 ||
+ att->Renderbuffer->Height < 1) {
+ att_incomplete("0x0 renderbuffer");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ if (format == GL_COLOR) {
+ if (!_mesa_is_legal_color_format(ctx, baseFormat)) {
+ att_incomplete("bad renderbuffer color format");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ }
+ else if (format == GL_DEPTH) {
+ if (baseFormat == GL_DEPTH_COMPONENT) {
+ /* OK */
+ }
+ else if (ctx->Extensions.EXT_packed_depth_stencil &&
+ baseFormat == GL_DEPTH_STENCIL_EXT) {
+ /* OK */
+ }
+ else {
+ att_incomplete("bad renderbuffer depth format");
+ att->Complete = GL_FALSE;
+ return;
+ }
+ }
+ else {
+ assert(format == GL_STENCIL);
+ if (baseFormat == GL_STENCIL_INDEX) {
+ /* OK */
+ }
+ else if (ctx->Extensions.EXT_packed_depth_stencil &&
+ baseFormat == GL_DEPTH_STENCIL_EXT) {
+ /* OK */
+ }
+ else {
+ att->Complete = GL_FALSE;
+ att_incomplete("bad renderbuffer stencil format");
+ return;
+ }
+ }
+ }
+ else {
+ ASSERT(att->Type == GL_NONE);
+ /* complete */
+ return;
+ }
+}
+
+
+/**
+ * Test if the given framebuffer object is complete and update its
+ * Status field with the results.
+ * Calls the ctx->Driver.ValidateFramebuffer() function to allow the
+ * driver to make hardware-specific validation/completeness checks.
+ * Also update the framebuffer's Width and Height fields if the
+ * framebuffer is complete.
+ */
+void
+_mesa_test_framebuffer_completeness(struct gl_context *ctx,
+ struct gl_framebuffer *fb)
+{
+ GLuint numImages;
+ GLenum intFormat = GL_NONE; /* color buffers' internal format */
+ GLuint minWidth = ~0, minHeight = ~0, maxWidth = 0, maxHeight = 0;
+ GLint numSamples = -1;
+ GLint i;
+ GLuint j;
+
+ assert(fb->Name != 0);
+
+ numImages = 0;
+ fb->Width = 0;
+ fb->Height = 0;
+
+ /* Start at -2 to more easily loop over all attachment points.
+ * -2: depth buffer
+ * -1: stencil buffer
+ * >=0: color buffer
+ */
+ for (i = -2; i < (GLint) ctx->Const.MaxColorAttachments; i++) {
+ struct gl_renderbuffer_attachment *att;
+ GLenum f;
+ gl_format attFormat;
+
+ /*
+ * XXX for ARB_fbo, only check color buffers that are named by
+ * GL_READ_BUFFER and GL_DRAW_BUFFERi.
+ */
+
+ /* check for attachment completeness
+ */
+ if (i == -2) {
+ att = &fb->Attachment[BUFFER_DEPTH];
+ test_attachment_completeness(ctx, GL_DEPTH, att);
+ if (!att->Complete) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
+ fbo_incomplete("depth attachment incomplete", -1);
+ return;
+ }
+ }
+ else if (i == -1) {
+ att = &fb->Attachment[BUFFER_STENCIL];
+ test_attachment_completeness(ctx, GL_STENCIL, att);
+ if (!att->Complete) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
+ fbo_incomplete("stencil attachment incomplete", -1);
+ return;
+ }
+ }
+ else {
+ att = &fb->Attachment[BUFFER_COLOR0 + i];
+ test_attachment_completeness(ctx, GL_COLOR, att);
+ if (!att->Complete) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT;
+ fbo_incomplete("color attachment incomplete", i);
+ return;
+ }
+ }
+
+ /* get width, height, format of the renderbuffer/texture
+ */
+ if (att->Type == GL_TEXTURE) {
+ const struct gl_texture_image *texImg =
+ _mesa_get_attachment_teximage(att);
+ minWidth = MIN2(minWidth, texImg->Width);
+ maxWidth = MAX2(maxWidth, texImg->Width);
+ minHeight = MIN2(minHeight, texImg->Height);
+ maxHeight = MAX2(maxHeight, texImg->Height);
+ f = texImg->_BaseFormat;
+ attFormat = texImg->TexFormat;
+ numImages++;
+ if (!_mesa_is_legal_color_format(ctx, f) &&
+ !is_legal_depth_format(ctx, f)) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
+ fbo_incomplete("texture attachment incomplete", -1);
+ return;
+ }
+ }
+ else if (att->Type == GL_RENDERBUFFER_EXT) {
+ minWidth = MIN2(minWidth, att->Renderbuffer->Width);
+ maxWidth = MAX2(minWidth, att->Renderbuffer->Width);
+ minHeight = MIN2(minHeight, att->Renderbuffer->Height);
+ maxHeight = MAX2(minHeight, att->Renderbuffer->Height);
+ f = att->Renderbuffer->InternalFormat;
+ attFormat = att->Renderbuffer->Format;
+ numImages++;
+ }
+ else {
+ assert(att->Type == GL_NONE);
+ continue;
+ }
+
+ if (att->Renderbuffer && numSamples < 0) {
+ /* first buffer */
+ numSamples = att->Renderbuffer->NumSamples;
+ }
+
+ /* check if integer color */
+ fb->_IntegerColor = _mesa_is_format_integer_color(attFormat);
+
+ /* Error-check width, height, format, samples
+ */
+ if (numImages == 1) {
+ /* save format, num samples */
+ if (i >= 0) {
+ intFormat = f;
+ }
+ }
+ else {
+ if (!ctx->Extensions.ARB_framebuffer_object) {
+ /* check that width, height, format are same */
+ if (minWidth != maxWidth || minHeight != maxHeight) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT;
+ fbo_incomplete("width or height mismatch", -1);
+ return;
+ }
+ /* check that all color buffer have same format */
+ if (intFormat != GL_NONE && f != intFormat) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT;
+ fbo_incomplete("format mismatch", -1);
+ return;
+ }
+ }
+ if (att->Renderbuffer &&
+ att->Renderbuffer->NumSamples != numSamples) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
+ fbo_incomplete("inconsistant number of samples", i);
+ return;
+ }
+
+ }
+ }
+
+#if FEATURE_GL
+ if (ctx->API == API_OPENGL) {
+ /* Check that all DrawBuffers are present */
+ for (j = 0; j < ctx->Const.MaxDrawBuffers; j++) {
+ if (fb->ColorDrawBuffer[j] != GL_NONE) {
+ const struct gl_renderbuffer_attachment *att
+ = _mesa_get_attachment(ctx, fb, fb->ColorDrawBuffer[j]);
+ assert(att);
+ if (att->Type == GL_NONE) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT;
+ fbo_incomplete("missing drawbuffer", j);
+ return;
+ }
+ }
+ }
+
+ /* Check that the ReadBuffer is present */
+ if (fb->ColorReadBuffer != GL_NONE) {
+ const struct gl_renderbuffer_attachment *att
+ = _mesa_get_attachment(ctx, fb, fb->ColorReadBuffer);
+ assert(att);
+ if (att->Type == GL_NONE) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT;
+ fbo_incomplete("missing readbuffer", -1);
+ return;
+ }
+ }
+ }
+#else
+ (void) j;
+#endif
+
+ if (numImages == 0) {
+ fb->_Status = GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT;
+ fbo_incomplete("no attachments", -1);
+ return;
+ }
+
+ /* Provisionally set status = COMPLETE ... */
+ fb->_Status = GL_FRAMEBUFFER_COMPLETE_EXT;
+
+ /* ... but the driver may say the FB is incomplete.
+ * Drivers will most likely set the status to GL_FRAMEBUFFER_UNSUPPORTED
+ * if anything.
+ */
+ if (ctx->Driver.ValidateFramebuffer) {
+ ctx->Driver.ValidateFramebuffer(ctx, fb);
+ if (fb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ fbo_incomplete("driver marked FBO as incomplete", -1);
+ }
+ }
+
+ if (fb->_Status == GL_FRAMEBUFFER_COMPLETE_EXT) {
+ /*
+ * Note that if ARB_framebuffer_object is supported and the attached
+ * renderbuffers/textures are different sizes, the framebuffer
+ * width/height will be set to the smallest width/height.
+ */
+ fb->Width = minWidth;
+ fb->Height = minHeight;
+
+ /* finally, update the visual info for the framebuffer */
+ _mesa_update_framebuffer_visual(ctx, fb);
+ }
+}
+
+
+GLboolean GLAPIENTRY
+_mesa_IsRenderbufferEXT(GLuint renderbuffer)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
+ if (renderbuffer) {
+ struct gl_renderbuffer *rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
+ if (rb != NULL && rb != &DummyRenderbuffer)
+ return GL_TRUE;
+ }
+ return GL_FALSE;
+}
+
+
+void GLAPIENTRY
+_mesa_BindRenderbufferEXT(GLenum target, GLuint renderbuffer)
+{
+ struct gl_renderbuffer *newRb;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (target != GL_RENDERBUFFER_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glBindRenderbufferEXT(target)");
+ return;
+ }
+
+ /* No need to flush here since the render buffer binding has no
+ * effect on rendering state.
+ */
+
+ if (renderbuffer) {
+ newRb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
+ if (newRb == &DummyRenderbuffer) {
+ /* ID was reserved, but no real renderbuffer object made yet */
+ newRb = NULL;
+ }
+ else if (!newRb && ctx->Extensions.ARB_framebuffer_object) {
+ /* All RB IDs must be Gen'd */
+ _mesa_error(ctx, GL_INVALID_OPERATION, "glBindRenderbuffer(buffer)");
+ return;
+ }
+
+ if (!newRb) {
+ /* create new renderbuffer object */
+ newRb = ctx->Driver.NewRenderbuffer(ctx, renderbuffer);
+ if (!newRb) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT");
+ return;
+ }
+ ASSERT(newRb->AllocStorage);
+ _mesa_HashInsert(ctx->Shared->RenderBuffers, renderbuffer, newRb);
+ newRb->RefCount = 1; /* referenced by hash table */
+ }
+ }
+ else {
+ newRb = NULL;
+ }
+
+ ASSERT(newRb != &DummyRenderbuffer);
+
+ _mesa_reference_renderbuffer(&ctx->CurrentRenderbuffer, newRb);
+}
+
+
+/**
+ * If the given renderbuffer is anywhere attached to the framebuffer, detach
+ * the renderbuffer.
+ * This is used when a renderbuffer object is deleted.
+ * The spec calls for unbinding.
+ */
+static void
+detach_renderbuffer(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ struct gl_renderbuffer *rb)
+{
+ GLuint i;
+ for (i = 0; i < BUFFER_COUNT; i++) {
+ if (fb->Attachment[i].Renderbuffer == rb) {
+ _mesa_remove_attachment(ctx, &fb->Attachment[i]);
+ }
+ }
+ invalidate_framebuffer(fb);
+}
+
+
+void GLAPIENTRY
+_mesa_DeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
+{
+ GLint i;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ for (i = 0; i < n; i++) {
+ if (renderbuffers[i] > 0) {
+ struct gl_renderbuffer *rb;
+ rb = _mesa_lookup_renderbuffer(ctx, renderbuffers[i]);
+ if (rb) {
+ /* check if deleting currently bound renderbuffer object */
+ if (rb == ctx->CurrentRenderbuffer) {
+ /* bind default */
+ ASSERT(rb->RefCount >= 2);
+ _mesa_BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ }
+
+ if (ctx->DrawBuffer->Name) {
+ detach_renderbuffer(ctx, ctx->DrawBuffer, rb);
+ }
+ if (ctx->ReadBuffer->Name && ctx->ReadBuffer != ctx->DrawBuffer) {
+ detach_renderbuffer(ctx, ctx->ReadBuffer, rb);
+ }
+
+ /* Remove from hash table immediately, to free the ID.
+ * But the object will not be freed until it's no longer
+ * referenced anywhere else.
+ */
+ _mesa_HashRemove(ctx->Shared->RenderBuffers, renderbuffers[i]);
+
+ if (rb != &DummyRenderbuffer) {
+ /* no longer referenced by hash table */
+ _mesa_reference_renderbuffer(&rb, NULL);
+ }
+ }
+ }
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_GenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint first;
+ GLint i;
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (n < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "glGenRenderbuffersEXT(n)");
+ return;
+ }
+
+ if (!renderbuffers)
+ return;
+
+ first = _mesa_HashFindFreeKeyBlock(ctx->Shared->RenderBuffers, n);
+
+ for (i = 0; i < n; i++) {
+ GLuint name = first + i;
+ renderbuffers[i] = name;
+ /* insert dummy placeholder into hash table */
+ _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+ _mesa_HashInsert(ctx->Shared->RenderBuffers, name, &DummyRenderbuffer);
+ _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+ }
+}
+
+
+/**
+ * Given an internal format token for a render buffer, return the
+ * corresponding base format (one of GL_RGB, GL_RGBA, GL_STENCIL_INDEX,
+ * GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL_EXT, GL_ALPHA, GL_LUMINANCE,
+ * GL_LUMINANCE_ALPHA, GL_INTENSITY, etc).
+ *
+ * This is similar to _mesa_base_tex_format() but the set of valid
+ * internal formats is different.
+ *
+ * Note that even if a format is determined to be legal here, validation
+ * of the FBO may fail if the format is not supported by the driver/GPU.
+ *
+ * \param internalFormat as passed to glRenderbufferStorage()
+ * \return the base internal format, or 0 if internalFormat is illegal
+ */
+GLenum
+_mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
+{
+ /*
+ * Notes: some formats such as alpha, luminance, etc. were added
+ * with GL_ARB_framebuffer_object.
+ */
+ switch (internalFormat) {
+ case GL_ALPHA:
+ case GL_ALPHA4:
+ case GL_ALPHA8:
+ case GL_ALPHA12:
+ case GL_ALPHA16:
+ return ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
+ case GL_LUMINANCE:
+ case GL_LUMINANCE4:
+ case GL_LUMINANCE8:
+ case GL_LUMINANCE12:
+ case GL_LUMINANCE16:
+ return ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
+ case GL_LUMINANCE_ALPHA:
+ case GL_LUMINANCE4_ALPHA4:
+ case GL_LUMINANCE6_ALPHA2:
+ case GL_LUMINANCE8_ALPHA8:
+ case GL_LUMINANCE12_ALPHA4:
+ case GL_LUMINANCE12_ALPHA12:
+ case GL_LUMINANCE16_ALPHA16:
+ return ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
+ case GL_INTENSITY:
+ case GL_INTENSITY4:
+ case GL_INTENSITY8:
+ case GL_INTENSITY12:
+ case GL_INTENSITY16:
+ return ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
+ case GL_RGB:
+ case GL_R3_G3_B2:
+ case GL_RGB4:
+ case GL_RGB5:
+ case GL_RGB8:
+ case GL_RGB10:
+ case GL_RGB12:
+ case GL_RGB16:
+ case GL_SRGB8_EXT:
+ return GL_RGB;
+ case GL_RGBA:
+ case GL_RGBA2:
+ case GL_RGBA4:
+ case GL_RGB5_A1:
+ case GL_RGBA8:
+ case GL_RGB10_A2:
+ case GL_RGBA12:
+ case GL_RGBA16:
+ case GL_SRGB8_ALPHA8_EXT:
+ return GL_RGBA;
+ case GL_STENCIL_INDEX:
+ case GL_STENCIL_INDEX1_EXT:
+ case GL_STENCIL_INDEX4_EXT:
+ case GL_STENCIL_INDEX8_EXT:
+ case GL_STENCIL_INDEX16_EXT:
+ return GL_STENCIL_INDEX;
+ case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
+ return GL_DEPTH_COMPONENT;
+ case GL_DEPTH_STENCIL_EXT:
+ case GL_DEPTH24_STENCIL8_EXT:
+ if (ctx->Extensions.EXT_packed_depth_stencil)
+ return GL_DEPTH_STENCIL_EXT;
+ else
+ return 0;
+ case GL_RED:
+ case GL_R8:
+ case GL_R16:
+ return ctx->Extensions.ARB_texture_rg ? GL_RED : 0;
+ case GL_RG:
+ case GL_RG8:
+ case GL_RG16:
+ return ctx->Extensions.ARB_texture_rg ? GL_RG : 0;
+ /* signed normalized texture formats */
+ case GL_RED_SNORM:
+ case GL_R8_SNORM:
+ case GL_R16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm ? GL_RED : 0;
+ case GL_RG_SNORM:
+ case GL_RG8_SNORM:
+ case GL_RG16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm ? GL_RG : 0;
+ case GL_RGB_SNORM:
+ case GL_RGB8_SNORM:
+ case GL_RGB16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm ? GL_RGB : 0;
+ case GL_RGBA_SNORM:
+ case GL_RGBA8_SNORM:
+ case GL_RGBA16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm ? GL_RGBA : 0;
+ case GL_ALPHA_SNORM:
+ case GL_ALPHA8_SNORM:
+ case GL_ALPHA16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
+ case GL_LUMINANCE_SNORM:
+ case GL_LUMINANCE8_SNORM:
+ case GL_LUMINANCE16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
+ case GL_LUMINANCE_ALPHA_SNORM:
+ case GL_LUMINANCE8_ALPHA8_SNORM:
+ case GL_LUMINANCE16_ALPHA16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
+ case GL_INTENSITY_SNORM:
+ case GL_INTENSITY8_SNORM:
+ case GL_INTENSITY16_SNORM:
+ return ctx->Extensions.EXT_texture_snorm &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
+ case GL_R16F:
+ case GL_R32F:
+ return ctx->Extensions.ARB_texture_rg &&
+ ctx->Extensions.ARB_texture_float ? GL_RED : 0;
+ case GL_RG16F:
+ case GL_RG32F:
+ return ctx->Extensions.ARB_texture_rg &&
+ ctx->Extensions.ARB_texture_float ? GL_RG : 0;
+ case GL_RGB16F:
+ case GL_RGB32F:
+ return ctx->Extensions.ARB_texture_float ? GL_RGB : 0;
+ case GL_RGBA16F:
+ case GL_RGBA32F:
+ return ctx->Extensions.ARB_texture_float ? GL_RGBA : 0;
+ case GL_ALPHA16F_ARB:
+ case GL_ALPHA32F_ARB:
+ return ctx->Extensions.ARB_texture_float &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
+ case GL_LUMINANCE16F_ARB:
+ case GL_LUMINANCE32F_ARB:
+ return ctx->Extensions.ARB_texture_float &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
+ case GL_LUMINANCE_ALPHA16F_ARB:
+ case GL_LUMINANCE_ALPHA32F_ARB:
+ return ctx->Extensions.ARB_texture_float &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
+ case GL_INTENSITY16F_ARB:
+ case GL_INTENSITY32F_ARB:
+ return ctx->Extensions.ARB_texture_float &&
+ ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
+ case GL_RGB9_E5:
+ return ctx->Extensions.EXT_texture_shared_exponent ? GL_RGB : 0;
+ case GL_R11F_G11F_B10F:
+ return ctx->Extensions.EXT_packed_float ? GL_RGB : 0;
+ /* XXX add integer formats eventually */
+ default:
+ return 0;
+ }
+}
+
+
+/**
+ * Invalidate a renderbuffer attachment. Called from _mesa_HashWalk().
+ */
+static void
+invalidate_rb(GLuint key, void *data, void *userData)
+{
+ struct gl_framebuffer *fb = (struct gl_framebuffer *) data;
+ struct gl_renderbuffer *rb = (struct gl_renderbuffer *) userData;
+
+ /* If this is a user-created FBO */
+ if (fb->Name) {
+ GLuint i;
+ for (i = 0; i < BUFFER_COUNT; i++) {
+ struct gl_renderbuffer_attachment *att = fb->Attachment + i;
+ if (att->Type == GL_RENDERBUFFER &&
+ att->Renderbuffer == rb) {
+ /* Mark fb status as indeterminate to force re-validation */
+ fb->_Status = 0;
+ return;
+ }
+ }
+ }
+}
+
+
+/** sentinal value, see below */
+#define NO_SAMPLES 1000
+
+
+/**
+ * Helper function used by _mesa_RenderbufferStorageEXT() and
+ * _mesa_RenderbufferStorageMultisample().
+ * samples will be NO_SAMPLES if called by _mesa_RenderbufferStorageEXT().
+ */
+static void
+renderbuffer_storage(GLenum target, GLenum internalFormat,
+ GLsizei width, GLsizei height, GLsizei samples)
+{
+ const char *func = samples == NO_SAMPLES ?
+ "glRenderbufferStorage" : "RenderbufferStorageMultisample";
+ struct gl_renderbuffer *rb;
+ GLenum baseFormat;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (target != GL_RENDERBUFFER_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func);
+ return;
+ }
+
+ baseFormat = _mesa_base_fbo_format(ctx, internalFormat);
+ if (baseFormat == 0) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(internalFormat)", func);
+ return;
+ }
+
+ if (width < 1 || width > (GLsizei) ctx->Const.MaxRenderbufferSize) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(width)", func);
+ return;
+ }
+
+ if (height < 1 || height > (GLsizei) ctx->Const.MaxRenderbufferSize) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(height)", func);
+ return;
+ }
+
+ if (samples == NO_SAMPLES) {
+ /* NumSamples == 0 indicates non-multisampling */
+ samples = 0;
+ }
+ else if (samples > (GLsizei) ctx->Const.MaxSamples) {
+ /* note: driver may choose to use more samples than what's requested */
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(samples)", func);
+ return;
+ }
+
+ rb = ctx->CurrentRenderbuffer;
+ if (!rb) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
+ return;
+ }
+
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ if (rb->InternalFormat == internalFormat &&
+ rb->Width == (GLuint) width &&
+ rb->Height == (GLuint) height) {
+ /* no change in allocation needed */
+ return;
+ }
+
+ /* These MUST get set by the AllocStorage func */
+ rb->Format = MESA_FORMAT_NONE;
+ rb->NumSamples = samples;
+
+ /* Now allocate the storage */
+ ASSERT(rb->AllocStorage);
+ if (rb->AllocStorage(ctx, rb, internalFormat, width, height)) {
+ /* No error - check/set fields now */
+ assert(rb->Format != MESA_FORMAT_NONE);
+ assert(rb->Width == (GLuint) width);
+ assert(rb->Height == (GLuint) height);
+ rb->InternalFormat = internalFormat;
+ rb->_BaseFormat = baseFormat;
+ assert(rb->_BaseFormat != 0);
+ }
+ else {
+ /* Probably ran out of memory - clear the fields */
+ rb->Width = 0;
+ rb->Height = 0;
+ rb->Format = MESA_FORMAT_NONE;
+ rb->InternalFormat = GL_NONE;
+ rb->_BaseFormat = GL_NONE;
+ rb->NumSamples = 0;
+ }
+
+ /* Invalidate the framebuffers the renderbuffer is attached in. */
+ if (rb->AttachedAnytime) {
+ _mesa_HashWalk(ctx->Shared->FrameBuffers, invalidate_rb, rb);
+ }
+}
+
+
+#if FEATURE_OES_EGL_image
+void GLAPIENTRY
+_mesa_EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
+{
+ struct gl_renderbuffer *rb;
+ GET_CURRENT_CONTEXT(ctx);
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (!ctx->Extensions.OES_EGL_image) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glEGLImageTargetRenderbufferStorageOES(unsupported)");
+ return;
+ }
+
+ if (target != GL_RENDERBUFFER) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "EGLImageTargetRenderbufferStorageOES");
+ return;
+ }
+
+ rb = ctx->CurrentRenderbuffer;
+ if (!rb) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "EGLImageTargetRenderbufferStorageOES");
+ return;
+ }
+
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ ctx->Driver.EGLImageTargetRenderbufferStorage(ctx, rb, image);
+}
+#endif
+
+
+/**
+ * Helper function for _mesa_GetRenderbufferParameterivEXT() and
+ * _mesa_GetFramebufferAttachmentParameterivEXT()
+ * We have to be careful to respect the base format. For example, if a
+ * renderbuffer/texture was created with internalFormat=GL_RGB but the
+ * driver actually chose a GL_RGBA format, when the user queries ALPHA_SIZE
+ * we need to return zero.
+ */
+static GLint
+get_component_bits(GLenum pname, GLenum baseFormat, gl_format format)
+{
+ switch (pname) {
+ case GL_RENDERBUFFER_RED_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
+ if (baseFormat == GL_RGB || baseFormat == GL_RGBA ||
+ baseFormat == GL_RG || baseFormat == GL_RED)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ case GL_RENDERBUFFER_GREEN_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
+ if (baseFormat == GL_RGB || baseFormat == GL_RGBA || baseFormat == GL_RG)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ case GL_RENDERBUFFER_BLUE_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
+ if (baseFormat == GL_RGB || baseFormat == GL_RGBA)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
+ if (baseFormat == GL_RGBA || baseFormat == GL_ALPHA ||
+ baseFormat == GL_LUMINANCE_ALPHA)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
+ if (baseFormat == GL_DEPTH_COMPONENT || baseFormat == GL_DEPTH_STENCIL)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
+ case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
+ if (baseFormat == GL_STENCIL_INDEX || baseFormat == GL_DEPTH_STENCIL)
+ return _mesa_get_format_bits(format, pname);
+ else
+ return 0;
+ default:
+ return 0;
+ }
+}
+
+
+
+void GLAPIENTRY
+_mesa_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
+ GLsizei width, GLsizei height)
+{
+ /* GL_ARB_fbo says calling this function is equivalent to calling
+ * glRenderbufferStorageMultisample() with samples=0. We pass in
+ * a token value here just for error reporting purposes.
+ */
+ renderbuffer_storage(target, internalFormat, width, height, NO_SAMPLES);
+}
+
+
+void GLAPIENTRY
+_mesa_RenderbufferStorageMultisample(GLenum target, GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width, GLsizei height)
+{
+ renderbuffer_storage(target, internalFormat, width, height, samples);
+}
+
+
+/**
+ * OpenGL ES version of glRenderBufferStorage.
+ */
+void GLAPIENTRY
+_es_RenderbufferStorageEXT(GLenum target, GLenum internalFormat,
+ GLsizei width, GLsizei height)
+{
+ switch (internalFormat) {
+ case GL_RGB565:
+ /* XXX this confuses GL_RENDERBUFFER_INTERNAL_FORMAT_OES */
+ /* choose a closest format */
+ internalFormat = GL_RGB5;
+ break;
+ default:
+ break;
+ }
+
+ renderbuffer_storage(target, internalFormat, width, height, 0);
+}
+
+
+void GLAPIENTRY
+_mesa_GetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
+{
+ struct gl_renderbuffer *rb;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (target != GL_RENDERBUFFER_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetRenderbufferParameterivEXT(target)");
+ return;
+ }
+
+ rb = ctx->CurrentRenderbuffer;
+ if (!rb) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glGetRenderbufferParameterivEXT");
+ return;
+ }
+
+ /* No need to flush here since we're just quering state which is
+ * not effected by rendering.
+ */
+
+ switch (pname) {
+ case GL_RENDERBUFFER_WIDTH_EXT:
+ *params = rb->Width;
+ return;
+ case GL_RENDERBUFFER_HEIGHT_EXT:
+ *params = rb->Height;
+ return;
+ case GL_RENDERBUFFER_INTERNAL_FORMAT_EXT:
+ *params = rb->InternalFormat;
+ return;
+ case GL_RENDERBUFFER_RED_SIZE_EXT:
+ case GL_RENDERBUFFER_GREEN_SIZE_EXT:
+ case GL_RENDERBUFFER_BLUE_SIZE_EXT:
+ case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
+ case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
+ case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
+ *params = get_component_bits(pname, rb->_BaseFormat, rb->Format);
+ break;
+ case GL_RENDERBUFFER_SAMPLES:
+ if (ctx->Extensions.ARB_framebuffer_object) {
+ *params = rb->NumSamples;
+ break;
+ }
+ /* fallthrough */
+ default:
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetRenderbufferParameterivEXT(target)");
+ return;
+ }
+}
+
+
+GLboolean GLAPIENTRY
+_mesa_IsFramebufferEXT(GLuint framebuffer)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
+ if (framebuffer) {
+ struct gl_framebuffer *rb = _mesa_lookup_framebuffer(ctx, framebuffer);
+ if (rb != NULL && rb != &DummyFramebuffer)
+ return GL_TRUE;
+ }
+ return GL_FALSE;
+}
+
+
+/**
+ * Check if any of the attachments of the given framebuffer are textures
+ * (render to texture). Call ctx->Driver.RenderTexture() for such
+ * attachments.
+ */
+static void
+check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+{
+ GLuint i;
+ ASSERT(ctx->Driver.RenderTexture);
+
+ if (fb->Name == 0)
+ return; /* can't render to texture with winsys framebuffers */
+
+ for (i = 0; i < BUFFER_COUNT; i++) {
+ struct gl_renderbuffer_attachment *att = fb->Attachment + i;
+ if (att->Texture && _mesa_get_attachment_teximage(att)) {
+ ctx->Driver.RenderTexture(ctx, fb, att);
+ }
+ }
+}
+
+
+/**
+ * Examine all the framebuffer's attachments to see if any are textures.
+ * If so, call ctx->Driver.FinishRenderTexture() for each texture to
+ * notify the device driver that the texture image may have changed.
+ */
+static void
+check_end_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
+{
+ if (fb->Name == 0)
+ return; /* can't render to texture with winsys framebuffers */
+
+ if (ctx->Driver.FinishRenderTexture) {
+ GLuint i;
+ for (i = 0; i < BUFFER_COUNT; i++) {
+ struct gl_renderbuffer_attachment *att = fb->Attachment + i;
+ if (att->Texture && att->Renderbuffer) {
+ ctx->Driver.FinishRenderTexture(ctx, att);
+ }
+ }
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
+{
+ struct gl_framebuffer *newDrawFb, *newReadFb;
+ struct gl_framebuffer *oldDrawFb, *oldReadFb;
+ GLboolean bindReadBuf, bindDrawBuf;
+ GET_CURRENT_CONTEXT(ctx);
+
+#ifdef DEBUG
+ if (ctx->Extensions.ARB_framebuffer_object) {
+ ASSERT(ctx->Extensions.EXT_framebuffer_object);
+ ASSERT(ctx->Extensions.EXT_framebuffer_blit);
+ }
+#endif
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (!ctx->Extensions.EXT_framebuffer_object) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBindFramebufferEXT(unsupported)");
+ return;
+ }
+
+ switch (target) {
+#if FEATURE_EXT_framebuffer_blit
+ case GL_DRAW_FRAMEBUFFER_EXT:
+ if (!ctx->Extensions.EXT_framebuffer_blit) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
+ return;
+ }
+ bindDrawBuf = GL_TRUE;
+ bindReadBuf = GL_FALSE;
+ break;
+ case GL_READ_FRAMEBUFFER_EXT:
+ if (!ctx->Extensions.EXT_framebuffer_blit) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
+ return;
+ }
+ bindDrawBuf = GL_FALSE;
+ bindReadBuf = GL_TRUE;
+ break;
+#endif
+ case GL_FRAMEBUFFER_EXT:
+ bindDrawBuf = GL_TRUE;
+ bindReadBuf = GL_TRUE;
+ break;
+ default:
+ _mesa_error(ctx, GL_INVALID_ENUM, "glBindFramebufferEXT(target)");
+ return;
+ }
+
+ if (framebuffer) {
+ /* Binding a user-created framebuffer object */
+ newDrawFb = _mesa_lookup_framebuffer(ctx, framebuffer);
+ if (newDrawFb == &DummyFramebuffer) {
+ /* ID was reserved, but no real framebuffer object made yet */
+ newDrawFb = NULL;
+ }
+ else if (!newDrawFb && ctx->Extensions.ARB_framebuffer_object) {
+ /* All FBO IDs must be Gen'd */
+ _mesa_error(ctx, GL_INVALID_OPERATION, "glBindFramebuffer(buffer)");
+ return;
+ }
+
+ if (!newDrawFb) {
+ /* create new framebuffer object */
+ newDrawFb = ctx->Driver.NewFramebuffer(ctx, framebuffer);
+ if (!newDrawFb) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindFramebufferEXT");
+ return;
+ }
+ _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newDrawFb);
+ }
+ newReadFb = newDrawFb;
+ }
+ else {
+ /* Binding the window system framebuffer (which was originally set
+ * with MakeCurrent).
+ */
+ newDrawFb = ctx->WinSysDrawBuffer;
+ newReadFb = ctx->WinSysReadBuffer;
+ }
+
+ ASSERT(newDrawFb);
+ ASSERT(newDrawFb != &DummyFramebuffer);
+
+ /* save pointers to current/old framebuffers */
+ oldDrawFb = ctx->DrawBuffer;
+ oldReadFb = ctx->ReadBuffer;
+
+ /* check if really changing bindings */
+ if (oldDrawFb == newDrawFb)
+ bindDrawBuf = GL_FALSE;
+ if (oldReadFb == newReadFb)
+ bindReadBuf = GL_FALSE;
+
+ /*
+ * OK, now bind the new Draw/Read framebuffers, if they're changing.
+ *
+ * We also check if we're beginning and/or ending render-to-texture.
+ * When a framebuffer with texture attachments is unbound, call
+ * ctx->Driver.FinishRenderTexture().
+ * When a framebuffer with texture attachments is bound, call
+ * ctx->Driver.RenderTexture().
+ *
+ * Note that if the ReadBuffer has texture attachments we don't consider
+ * that a render-to-texture case.
+ */
+ if (bindReadBuf) {
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ /* check if old readbuffer was render-to-texture */
+ check_end_texture_render(ctx, oldReadFb);
+
+ _mesa_reference_framebuffer(&ctx->ReadBuffer, newReadFb);
+ }
+
+ if (bindDrawBuf) {
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ /* check if old read/draw buffers were render-to-texture */
+ if (!bindReadBuf)
+ check_end_texture_render(ctx, oldReadFb);
+
+ if (oldDrawFb != oldReadFb)
+ check_end_texture_render(ctx, oldDrawFb);
+
+ /* check if newly bound framebuffer has any texture attachments */
+ check_begin_texture_render(ctx, newDrawFb);
+
+ _mesa_reference_framebuffer(&ctx->DrawBuffer, newDrawFb);
+ }
+
+ if ((bindDrawBuf || bindReadBuf) && ctx->Driver.BindFramebuffer) {
+ ctx->Driver.BindFramebuffer(ctx, target, newDrawFb, newReadFb);
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_DeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
+{
+ GLint i;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ for (i = 0; i < n; i++) {
+ if (framebuffers[i] > 0) {
+ struct gl_framebuffer *fb;
+ fb = _mesa_lookup_framebuffer(ctx, framebuffers[i]);
+ if (fb) {
+ ASSERT(fb == &DummyFramebuffer || fb->Name == framebuffers[i]);
+
+ /* check if deleting currently bound framebuffer object */
+ if (ctx->Extensions.EXT_framebuffer_blit) {
+ /* separate draw/read binding points */
+ if (fb == ctx->DrawBuffer) {
+ /* bind default */
+ ASSERT(fb->RefCount >= 2);
+ _mesa_BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
+ }
+ if (fb == ctx->ReadBuffer) {
+ /* bind default */
+ ASSERT(fb->RefCount >= 2);
+ _mesa_BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
+ }
+ }
+ else {
+ /* only one binding point for read/draw buffers */
+ if (fb == ctx->DrawBuffer || fb == ctx->ReadBuffer) {
+ /* bind default */
+ ASSERT(fb->RefCount >= 2);
+ _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ }
+ }
+
+ /* remove from hash table immediately, to free the ID */
+ _mesa_HashRemove(ctx->Shared->FrameBuffers, framebuffers[i]);
+
+ if (fb != &DummyFramebuffer) {
+ /* But the object will not be freed until it's no longer
+ * bound in any context.
+ */
+ _mesa_reference_framebuffer(&fb, NULL);
+ }
+ }
+ }
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_GenFramebuffersEXT(GLsizei n, GLuint *framebuffers)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ GLuint first;
+ GLint i;
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ if (n < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "glGenFramebuffersEXT(n)");
+ return;
+ }
+
+ if (!framebuffers)
+ return;
+
+ first = _mesa_HashFindFreeKeyBlock(ctx->Shared->FrameBuffers, n);
+
+ for (i = 0; i < n; i++) {
+ GLuint name = first + i;
+ framebuffers[i] = name;
+ /* insert dummy placeholder into hash table */
+ _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+ _mesa_HashInsert(ctx->Shared->FrameBuffers, name, &DummyFramebuffer);
+ _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+ }
+}
+
+
+
+GLenum GLAPIENTRY
+_mesa_CheckFramebufferStatusEXT(GLenum target)
+{
+ struct gl_framebuffer *buffer;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
+
+ buffer = get_framebuffer_target(ctx, target);
+ if (!buffer) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glCheckFramebufferStatus(target)");
+ return 0;
+ }
+
+ if (buffer->Name == 0) {
+ /* The window system / default framebuffer is always complete */
+ return GL_FRAMEBUFFER_COMPLETE_EXT;
+ }
+
+ /* No need to flush here */
+
+ if (buffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
+ _mesa_test_framebuffer_completeness(ctx, buffer);
+ }
+
+ return buffer->_Status;
+}
+
+
+
+/**
+ * Common code called by glFramebufferTexture1D/2D/3DEXT().
+ */
+static void
+framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target,
+ GLenum attachment, GLenum textarget, GLuint texture,
+ GLint level, GLint zoffset)
+{
+ struct gl_renderbuffer_attachment *att;
+ struct gl_texture_object *texObj = NULL;
+ struct gl_framebuffer *fb;
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ fb = get_framebuffer_target(ctx, target);
+ if (!fb) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferTexture%sEXT(target=0x%x)", caller, target);
+ return;
+ }
+
+ /* check framebuffer binding */
+ if (fb->Name == 0) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTexture%sEXT", caller);
+ return;
+ }
+
+
+ /* The textarget, level, and zoffset parameters are only validated if
+ * texture is non-zero.
+ */
+ if (texture) {
+ GLboolean err = GL_TRUE;
+
+ texObj = _mesa_lookup_texture(ctx, texture);
+ if (texObj != NULL) {
+ if (textarget == 0) {
+ /* XXX what's the purpose of this? */
+ err = (texObj->Target != GL_TEXTURE_3D) &&
+ (texObj->Target != GL_TEXTURE_1D_ARRAY_EXT) &&
+ (texObj->Target != GL_TEXTURE_2D_ARRAY_EXT);
+ }
+ else {
+ err = (texObj->Target == GL_TEXTURE_CUBE_MAP)
+ ? !IS_CUBE_FACE(textarget)
+ : (texObj->Target != textarget);
+ }
+ }
+ else {
+ /* can't render to a non-existant texture */
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTexture%sEXT(non existant texture)",
+ caller);
+ return;
+ }
+
+ if (err) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTexture%sEXT(texture target mismatch)",
+ caller);
+ return;
+ }
+
+ if (texObj->Target == GL_TEXTURE_3D) {
+ const GLint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
+ if (zoffset < 0 || zoffset >= maxSize) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glFramebufferTexture%sEXT(zoffset)", caller);
+ return;
+ }
+ }
+ else if ((texObj->Target == GL_TEXTURE_1D_ARRAY_EXT) ||
+ (texObj->Target == GL_TEXTURE_2D_ARRAY_EXT)) {
+ if (zoffset < 0 || zoffset >= ctx->Const.MaxArrayTextureLayers) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glFramebufferTexture%sEXT(layer)", caller);
+ return;
+ }
+ }
+
+ if ((level < 0) ||
+ (level >= _mesa_max_texture_levels(ctx, texObj->Target))) {
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glFramebufferTexture%sEXT(level)", caller);
+ return;
+ }
+ }
+
+ att = _mesa_get_attachment(ctx, fb, attachment);
+ if (att == NULL) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferTexture%sEXT(attachment)", caller);
+ return;
+ }
+
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ _glthread_LOCK_MUTEX(fb->Mutex);
+ if (texObj) {
+ _mesa_set_texture_attachment(ctx, fb, att, texObj, textarget,
+ level, zoffset);
+ /* Set the render-to-texture flag. We'll check this flag in
+ * glTexImage() and friends to determine if we need to revalidate
+ * any FBOs that might be rendering into this texture.
+ * This flag never gets cleared since it's non-trivial to determine
+ * when all FBOs might be done rendering to this texture. That's OK
+ * though since it's uncommon to render to a texture then repeatedly
+ * call glTexImage() to change images in the texture.
+ */
+ texObj->_RenderToTexture = GL_TRUE;
+ }
+ else {
+ _mesa_remove_attachment(ctx, att);
+ }
+
+ invalidate_framebuffer(fb);
+
+ _glthread_UNLOCK_MUTEX(fb->Mutex);
+}
+
+
+
+void GLAPIENTRY
+_mesa_FramebufferTexture1DEXT(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture, GLint level)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ if ((texture != 0) && (textarget != GL_TEXTURE_1D)) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferTexture1DEXT(textarget)");
+ return;
+ }
+
+ framebuffer_texture(ctx, "1D", target, attachment, textarget, texture,
+ level, 0);
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferTexture2DEXT(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture, GLint level)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ if ((texture != 0) &&
+ (textarget != GL_TEXTURE_2D) &&
+ (textarget != GL_TEXTURE_RECTANGLE_ARB) &&
+ (!IS_CUBE_FACE(textarget))) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTexture2DEXT(textarget=0x%x)", textarget);
+ return;
+ }
+
+ framebuffer_texture(ctx, "2D", target, attachment, textarget, texture,
+ level, 0);
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferTexture3DEXT(GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture,
+ GLint level, GLint zoffset)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ if ((texture != 0) && (textarget != GL_TEXTURE_3D)) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferTexture3DEXT(textarget)");
+ return;
+ }
+
+ framebuffer_texture(ctx, "3D", target, attachment, textarget, texture,
+ level, zoffset);
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferTextureLayerEXT(GLenum target, GLenum attachment,
+ GLuint texture, GLint level, GLint layer)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ framebuffer_texture(ctx, "Layer", target, attachment, 0, texture,
+ level, layer);
+}
+
+
+void GLAPIENTRY
+_mesa_FramebufferRenderbufferEXT(GLenum target, GLenum attachment,
+ GLenum renderbufferTarget,
+ GLuint renderbuffer)
+{
+ struct gl_renderbuffer_attachment *att;
+ struct gl_framebuffer *fb;
+ struct gl_renderbuffer *rb;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ fb = get_framebuffer_target(ctx, target);
+ if (!fb) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glFramebufferRenderbufferEXT(target)");
+ return;
+ }
+
+ if (renderbufferTarget != GL_RENDERBUFFER_EXT) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferRenderbufferEXT(renderbufferTarget)");
+ return;
+ }
+
+ if (fb->Name == 0) {
+ /* Can't attach new renderbuffers to a window system framebuffer */
+ _mesa_error(ctx, GL_INVALID_OPERATION, "glFramebufferRenderbufferEXT");
+ return;
+ }
+
+ att = _mesa_get_attachment(ctx, fb, attachment);
+ if (att == NULL) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glFramebufferRenderbufferEXT(invalid attachment %s)",
+ _mesa_lookup_enum_by_nr(attachment));
+ return;
+ }
+
+ if (renderbuffer) {
+ rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
+ if (!rb) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferRenderbufferEXT(non-existant"
+ " renderbuffer %u)", renderbuffer);
+ return;
+ }
+ else if (rb == &DummyRenderbuffer) {
+ /* This is what NVIDIA does */
+ _mesa_error(ctx, GL_INVALID_VALUE,
+ "glFramebufferRenderbufferEXT(renderbuffer %u)",
+ renderbuffer);
+ return;
+ }
+ }
+ else {
+ /* remove renderbuffer attachment */
+ rb = NULL;
+ }
+
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT &&
+ rb && rb->Format != MESA_FORMAT_NONE) {
+ /* make sure the renderbuffer is a depth/stencil format */
+ const GLenum baseFormat = _mesa_get_format_base_format(rb->Format);
+ if (baseFormat != GL_DEPTH_STENCIL) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferRenderbufferEXT(renderbuffer"
+ " is not DEPTH_STENCIL format)");
+ return;
+ }
+ }
+
+
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ assert(ctx->Driver.FramebufferRenderbuffer);
+ ctx->Driver.FramebufferRenderbuffer(ctx, fb, attachment, rb);
+
+ /* Some subsequent GL commands may depend on the framebuffer's visual
+ * after the binding is updated. Update visual info now.
+ */
+ _mesa_update_framebuffer_visual(ctx, fb);
+}
+
+
+void GLAPIENTRY
+_mesa_GetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment,
+ GLenum pname, GLint *params)
+{
+ const struct gl_renderbuffer_attachment *att;
+ struct gl_framebuffer *buffer;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+ buffer = get_framebuffer_target(ctx, target);
+ if (!buffer) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(target)");
+ return;
+ }
+
+ if (buffer->Name == 0) {
+ /* the default / window-system FBO */
+ att = _mesa_get_fb0_attachment(ctx, buffer, attachment);
+ }
+ else {
+ /* user-created framebuffer FBO */
+ att = _mesa_get_attachment(ctx, buffer, attachment);
+ }
+
+ if (att == NULL) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(attachment)");
+ return;
+ }
+
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
+ /* the depth and stencil attachments must point to the same buffer */
+ const struct gl_renderbuffer_attachment *depthAtt, *stencilAtt;
+ depthAtt = _mesa_get_attachment(ctx, buffer, GL_DEPTH_ATTACHMENT);
+ stencilAtt = _mesa_get_attachment(ctx, buffer, GL_STENCIL_ATTACHMENT);
+ if (depthAtt->Renderbuffer != stencilAtt->Renderbuffer) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glGetFramebufferAttachmentParameterivEXT(DEPTH/STENCIL"
+ " attachments differ)");
+ return;
+ }
+ }
+
+ /* No need to flush here */
+
+ switch (pname) {
+ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
+ *params = buffer->Name == 0 ? GL_FRAMEBUFFER_DEFAULT : att->Type;
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
+ if (att->Type == GL_RENDERBUFFER_EXT) {
+ *params = att->Renderbuffer->Name;
+ }
+ else if (att->Type == GL_TEXTURE) {
+ *params = att->Texture->Name;
+ }
+ else {
+ assert(att->Type == GL_NONE);
+ *params = 0;
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
+ if (att->Type == GL_TEXTURE) {
+ *params = att->TextureLevel;
+ }
+ else {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
+ if (att->Type == GL_TEXTURE) {
+ if (att->Texture && att->Texture->Target == GL_TEXTURE_CUBE_MAP) {
+ *params = GL_TEXTURE_CUBE_MAP_POSITIVE_X + att->CubeMapFace;
+ }
+ else {
+ *params = 0;
+ }
+ }
+ else {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
+ if (att->Type == GL_TEXTURE) {
+ if (att->Texture && att->Texture->Target == GL_TEXTURE_3D) {
+ *params = att->Zoffset;
+ }
+ else {
+ *params = 0;
+ }
+ }
+ else {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
+ if (!ctx->Extensions.ARB_framebuffer_object) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ }
+ else {
+ if (ctx->Extensions.EXT_framebuffer_sRGB && ctx->Const.sRGBCapable) {
+ *params = _mesa_get_format_color_encoding(att->Renderbuffer->Format);
+ }
+ else {
+ /* According to ARB_framebuffer_sRGB, we should return LINEAR
+ * if the sRGB conversion is unsupported. */
+ *params = GL_LINEAR;
+ }
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
+ if (!ctx->Extensions.ARB_framebuffer_object) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ return;
+ }
+ else {
+ gl_format format = att->Renderbuffer->Format;
+ if (format == MESA_FORMAT_CI8 || format == MESA_FORMAT_S8) {
+ /* special cases */
+ *params = GL_INDEX;
+ }
+ else {
+ *params = _mesa_get_format_datatype(format);
+ }
+ }
+ return;
+ case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
+ case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
+ case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
+ case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
+ case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
+ case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
+ if (!ctx->Extensions.ARB_framebuffer_object) {
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ }
+ else if (att->Texture) {
+ const struct gl_texture_image *texImage =
+ _mesa_select_tex_image(ctx, att->Texture, att->Texture->Target,
+ att->TextureLevel);
+ if (texImage) {
+ *params = get_component_bits(pname, texImage->_BaseFormat,
+ texImage->TexFormat);
+ }
+ else {
+ *params = 0;
+ }
+ }
+ else if (att->Renderbuffer) {
+ *params = get_component_bits(pname, att->Renderbuffer->_BaseFormat,
+ att->Renderbuffer->Format);
+ }
+ else {
+ *params = 0;
+ }
+ return;
+ default:
+ _mesa_error(ctx, GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameterivEXT(pname)");
+ return;
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_GenerateMipmapEXT(GLenum target)
+{
+ struct gl_texture_object *texObj;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ switch (target) {
+ case GL_TEXTURE_1D:
+ case GL_TEXTURE_2D:
+ case GL_TEXTURE_3D:
+ case GL_TEXTURE_CUBE_MAP:
+ /* OK, legal value */
+ break;
+ default:
+ /* XXX need to implement GL_TEXTURE_1D_ARRAY and GL_TEXTURE_2D_ARRAY */
+ _mesa_error(ctx, GL_INVALID_ENUM, "glGenerateMipmapEXT(target)");
+ return;
+ }
+
+ texObj = _mesa_get_current_tex_object(ctx, target);
+
+ if (texObj->BaseLevel >= texObj->MaxLevel) {
+ /* nothing to do */
+ return;
+ }
+
+ if (texObj->Target == GL_TEXTURE_CUBE_MAP &&
+ !_mesa_cube_complete(texObj)) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glGenerateMipmap(incomplete cube map)");
+ return;
+ }
+
+ _mesa_lock_texture(ctx, texObj);
+ if (target == GL_TEXTURE_CUBE_MAP) {
+ GLuint face;
+ for (face = 0; face < 6; face++)
+ ctx->Driver.GenerateMipmap(ctx,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + face,
+ texObj);
+ }
+ else {
+ ctx->Driver.GenerateMipmap(ctx, target, texObj);
+ }
+ _mesa_unlock_texture(ctx, texObj);
+}
+
+
+#if FEATURE_EXT_framebuffer_blit
+
+static const struct gl_renderbuffer_attachment *
+find_attachment(const struct gl_framebuffer *fb,
+ const struct gl_renderbuffer *rb)
+{
+ GLuint i;
+ for (i = 0; i < Elements(fb->Attachment); i++) {
+ if (fb->Attachment[i].Renderbuffer == rb)
+ return &fb->Attachment[i];
+ }
+ return NULL;
+}
+
+
+
+/**
+ * Blit rectangular region, optionally from one framebuffer to another.
+ *
+ * Note, if the src buffer is multisampled and the dest is not, this is
+ * when the samples must be resolved to a single color.
+ */
+void GLAPIENTRY
+_mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+ GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
+ GLbitfield mask, GLenum filter)
+{
+ const GLbitfield legalMaskBits = (GL_COLOR_BUFFER_BIT |
+ GL_DEPTH_BUFFER_BIT |
+ GL_STENCIL_BUFFER_BIT);
+ const struct gl_framebuffer *readFb, *drawFb;
+ const struct gl_renderbuffer *colorReadRb, *colorDrawRb;
+ GET_CURRENT_CONTEXT(ctx);
+
+ ASSERT_OUTSIDE_BEGIN_END(ctx);
+ FLUSH_VERTICES(ctx, _NEW_BUFFERS);
+
+ if (MESA_VERBOSE & VERBOSE_API)
+ _mesa_debug(ctx,
+ "glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d, 0x%x, %s)\n",
+ srcX0, srcY0, srcX1, srcY1,
+ dstX0, dstY0, dstX1, dstY1,
+ mask, _mesa_lookup_enum_by_nr(filter));
+
+ if (ctx->NewState) {
+ _mesa_update_state(ctx);
+ }
+
+ readFb = ctx->ReadBuffer;
+ drawFb = ctx->DrawBuffer;
+
+ if (!readFb || !drawFb) {
+ /* This will normally never happen but someday we may want to
+ * support MakeCurrent() with no drawables.
+ */
+ return;
+ }
+
+ /* check for complete framebuffers */
+ if (drawFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT ||
+ readFb->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+ _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+ "glBlitFramebufferEXT(incomplete draw/read buffers)");
+ return;
+ }
+
+ if (filter != GL_NEAREST && filter != GL_LINEAR) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "glBlitFramebufferEXT(filter)");
+ return;
+ }
+
+ if (mask & ~legalMaskBits) {
+ _mesa_error( ctx, GL_INVALID_VALUE, "glBlitFramebufferEXT(mask)");
+ return;
+ }
+
+ /* depth/stencil must be blitted with nearest filtering */
+ if ((mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))
+ && filter != GL_NEAREST) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(depth/stencil requires GL_NEAREST filter)");
+ return;
+ }
+
+ /* get color read/draw renderbuffers */
+ if (mask & GL_COLOR_BUFFER_BIT) {
+ colorReadRb = readFb->_ColorReadBuffer;
+ colorDrawRb = drawFb->_ColorDrawBuffers[0];
+ }
+ else {
+ colorReadRb = colorDrawRb = NULL;
+ }
+
+ if (mask & GL_STENCIL_BUFFER_BIT) {
+ struct gl_renderbuffer *readRb = readFb->_StencilBuffer;
+ struct gl_renderbuffer *drawRb = drawFb->_StencilBuffer;
+ if (!readRb ||
+ !drawRb ||
+ _mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) !=
+ _mesa_get_format_bits(drawRb->Format, GL_STENCIL_BITS)) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(stencil buffer size mismatch)");
+ return;
+ }
+ }
+
+ if (mask & GL_DEPTH_BUFFER_BIT) {
+ struct gl_renderbuffer *readRb = readFb->_DepthBuffer;
+ struct gl_renderbuffer *drawRb = drawFb->_DepthBuffer;
+ if (!readRb ||
+ !drawRb ||
+ _mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS) !=
+ _mesa_get_format_bits(drawRb->Format, GL_DEPTH_BITS)) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(depth buffer size mismatch)");
+ return;
+ }
+ }
+
+ if (readFb->Visual.samples > 0 &&
+ drawFb->Visual.samples > 0 &&
+ readFb->Visual.samples != drawFb->Visual.samples) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(mismatched samples");
+ return;
+ }
+
+ /* extra checks for multisample copies... */
+ if (readFb->Visual.samples > 0 || drawFb->Visual.samples > 0) {
+ /* src and dest region sizes must be the same */
+ if (srcX1 - srcX0 != dstX1 - dstX0 ||
+ srcY1 - srcY0 != dstY1 - dstY0) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(bad src/dst multisample region sizes)");
+ return;
+ }
+
+ /* color formats must match */
+ if (colorReadRb &&
+ colorDrawRb &&
+ colorReadRb->Format != colorDrawRb->Format) {
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glBlitFramebufferEXT(bad src/dst multisample pixel formats)");
+ return;
+ }
+ }
+
+ if (!ctx->Extensions.EXT_framebuffer_blit) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "glBlitFramebufferEXT");
+ return;
+ }
+
+ /* Debug code */
+ if (DEBUG_BLIT) {
+ printf("glBlitFramebuffer(%d, %d, %d, %d, %d, %d, %d, %d,"
+ " 0x%x, 0x%x)\n",
+ srcX0, srcY0, srcX1, srcY1,
+ dstX0, dstY0, dstX1, dstY1,
+ mask, filter);
+ if (colorReadRb) {
+ const struct gl_renderbuffer_attachment *att;
+
+ att = find_attachment(readFb, colorReadRb);
+ printf(" Src FBO %u RB %u (%dx%d) ",
+ readFb->Name, colorReadRb->Name,
+ colorReadRb->Width, colorReadRb->Height);
+ if (att && att->Texture) {
+ printf("Tex %u tgt 0x%x level %u face %u",
+ att->Texture->Name,
+ att->Texture->Target,
+ att->TextureLevel,
+ att->CubeMapFace);
+ }
+ printf("\n");
+
+ att = find_attachment(drawFb, colorDrawRb);
+ printf(" Dst FBO %u RB %u (%dx%d) ",
+ drawFb->Name, colorDrawRb->Name,
+ colorDrawRb->Width, colorDrawRb->Height);
+ if (att && att->Texture) {
+ printf("Tex %u tgt 0x%x level %u face %u",
+ att->Texture->Name,
+ att->Texture->Target,
+ att->TextureLevel,
+ att->CubeMapFace);
+ }
+ printf("\n");
+ }
+ }
+
+ ASSERT(ctx->Driver.BlitFramebuffer);
+ ctx->Driver.BlitFramebuffer(ctx,
+ srcX0, srcY0, srcX1, srcY1,
+ dstX0, dstY0, dstX1, dstY1,
+ mask, filter);
+}
+#endif /* FEATURE_EXT_framebuffer_blit */
+
+#if FEATURE_ARB_geometry_shader4
+void GLAPIENTRY
+_mesa_FramebufferTextureARB(GLenum target, GLenum attachment,
+ GLuint texture, GLint level)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTextureARB "
+ "not implemented!");
+}
+
+void GLAPIENTRY
+_mesa_FramebufferTextureFaceARB(GLenum target, GLenum attachment,
+ GLuint texture, GLint level, GLenum face)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "glFramebufferTextureFaceARB "
+ "not implemented!");
+}
+#endif /* FEATURE_ARB_geometry_shader4 */
diff --git a/mesalib/src/mesa/main/texrender.c b/mesalib/src/mesa/main/texrender.c
index 4bcef9899..a7641a5f9 100644
--- a/mesalib/src/mesa/main/texrender.c
+++ b/mesalib/src/mesa/main/texrender.c
@@ -1,657 +1,654 @@
-
-#include "context.h"
-#include "colormac.h"
-#include "fbobject.h"
-#include "macros.h"
-#include "texfetch.h"
-#include "teximage.h"
-#include "texrender.h"
-#include "renderbuffer.h"
-
-
-/*
- * Render-to-texture code for GL_EXT_framebuffer_object
- */
-
-
-/**
- * Derived from gl_renderbuffer class
- */
-struct texture_renderbuffer
-{
- struct gl_renderbuffer Base; /**< Base class object */
- struct gl_texture_image *TexImage;
- StoreTexelFunc Store;
- FetchTexelFuncF Fetchf;
- GLint Yoffset; /**< Layer for 1D array textures. */
- GLint Zoffset; /**< Layer for 2D array textures, or slice
- * for 3D textures
- */
-};
-
-
-/**
- * Get row of values from the renderbuffer that wraps a texture image.
- */
-static void
-texture_get_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- GLint x, GLint y, void *values)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- ASSERT(trb->TexImage->Width == rb->Width);
- ASSERT(trb->TexImage->Height == rb->Height);
-
- y += trb->Yoffset;
-
- if (rb->DataType == CHAN_TYPE) {
- GLchan *rgbaOut = (GLchan *) values;
- for (i = 0; i < count; i++) {
- GLfloat rgba[4];
- trb->Fetchf(trb->TexImage, x + i, y, z, rgba);
- UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- GLushort *zValues = (GLushort *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
- zValues[i] = (GLushort) (flt * 0xffff);
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- GLuint *zValues = (GLuint *) values;
- /*
- const GLdouble scale = (GLdouble) 0xffffffff;
- */
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
-#if 0
- /* this should work, but doesn't (overflow due to low precision) */
- zValues[i] = (GLuint) (flt * scale);
-#else
- /* temporary hack */
- zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
-#endif
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- GLuint *zValues = (GLuint *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
- zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- GLuint *zValues = (GLuint *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
- zValues[i] = (GLuint) (flt * 0xffffff);
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_get_row");
- }
-}
-
-
-static void
-texture_get_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- const GLint x[], const GLint y[], void *values)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- if (rb->DataType == CHAN_TYPE) {
- GLchan *rgbaOut = (GLchan *) values;
- for (i = 0; i < count; i++) {
- GLfloat rgba[4];
- trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
- z, rgba);
- UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- GLushort *zValues = (GLushort *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
- z, &flt);
- zValues[i] = (GLushort) (flt * 0xffff);
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- GLuint *zValues = (GLuint *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
- z, &flt);
-#if 0
- zValues[i] = (GLuint) (flt * 0xffffffff);
-#else
- zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
-#endif
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- GLuint *zValues = (GLuint *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
- z, &flt);
- zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- GLuint *zValues = (GLuint *) values;
- for (i = 0; i < count; i++) {
- GLfloat flt;
- trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
- z, &flt);
- zValues[i] = (GLuint) (flt * 0xffffff);
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_get_values");
- }
-}
-
-
-/**
- * Put row of values into a renderbuffer that wraps a texture image.
- */
-static void
-texture_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- GLint x, GLint y, const void *values, const GLubyte *mask)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- y += trb->Yoffset;
-
- if (rb->DataType == CHAN_TYPE) {
- const GLchan *rgba = (const GLchan *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, rgba);
- }
- rgba += 4;
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- const GLushort *zValues = (const GLushort *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_put_row");
- }
-}
-
-/**
- * Put row of RGB values into a renderbuffer that wraps a texture image.
- */
-static void
-texture_put_row_rgb(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- GLint x, GLint y, const void *values, const GLubyte *mask)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- y += trb->Yoffset;
-
- if (rb->DataType == CHAN_TYPE) {
- const GLchan *rgb = (const GLchan *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, rgb);
- }
- rgb += 3;
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- const GLushort *zValues = (const GLushort *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_put_row");
- }
-}
-
-
-static void
-texture_put_mono_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- GLint x, GLint y, const void *value, const GLubyte *mask)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- y += trb->Yoffset;
-
- if (rb->DataType == CHAN_TYPE) {
- const GLchan *rgba = (const GLchan *) value;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, rgba);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- const GLushort zValue = *((const GLushort *) value);
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, &zValue);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- const GLuint zValue = *((const GLuint *) value);
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, &zValue);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- const GLuint zValue = *((const GLuint *) value);
- const GLfloat flt = (GLfloat) ((zValue >> 8) * (1.0 / 0xffffff));
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- const GLuint zValue = *((const GLuint *) value);
- const GLfloat flt = (GLfloat) ((zValue & 0xffffff) * (1.0 / 0xffffff));
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x + i, y, z, &flt);
- }
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_put_mono_row");
- }
-}
-
-
-static void
-texture_put_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
- const GLint x[], const GLint y[], const void *values,
- const GLubyte *mask)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- if (rb->DataType == CHAN_TYPE) {
- const GLchan *rgba = (const GLchan *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, rgba);
- }
- rgba += 4;
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- const GLushort *zValues = (const GLushort *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- const GLuint *zValues = (const GLuint *) values;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
- }
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_put_values");
- }
-}
-
-
-static void
-texture_put_mono_values(struct gl_context *ctx, struct gl_renderbuffer *rb,
- GLuint count, const GLint x[], const GLint y[],
- const void *value, const GLubyte *mask)
-{
- const struct texture_renderbuffer *trb
- = (const struct texture_renderbuffer *) rb;
- const GLint z = trb->Zoffset;
- GLuint i;
-
- if (rb->DataType == CHAN_TYPE) {
- const GLchan *rgba = (const GLchan *) value;
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, rgba);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT) {
- const GLuint zValue = *((const GLuint *) value);
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &zValue);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_SHORT) {
- const GLushort zValue = *((const GLushort *) value);
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &zValue);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
- const GLuint zValue = *((const GLuint *) value);
- const GLfloat flt = (GLfloat) ((zValue >> 8) * (1.0 / 0xffffff));
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
- }
- }
- }
- else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
- const GLuint zValue = *((const GLuint *) value);
- const GLfloat flt = (GLfloat) ((zValue & 0xffffff) * (1.0 / 0xffffff));
- for (i = 0; i < count; i++) {
- if (!mask || mask[i]) {
- trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
- }
- }
- }
- else {
- _mesa_problem(ctx, "invalid rb->DataType in texture_put_mono_values");
- }
-}
-
-
-static void
-store_nop(struct gl_texture_image *texImage,
- GLint col, GLint row, GLint img,
- const void *texel)
-{
-}
-
-
-static void
-delete_texture_wrapper(struct gl_renderbuffer *rb)
-{
- ASSERT(rb->RefCount == 0);
- free(rb);
-}
-
-
-/**
- * This function creates a renderbuffer object which wraps a texture image.
- * The new renderbuffer is plugged into the given attachment point.
- * This allows rendering into the texture as if it were a renderbuffer.
- */
-static void
-wrap_texture(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
-{
- struct texture_renderbuffer *trb;
- const GLuint name = 0;
-
- ASSERT(att->Type == GL_TEXTURE);
- ASSERT(att->Renderbuffer == NULL);
-
- trb = CALLOC_STRUCT(texture_renderbuffer);
- if (!trb) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "wrap_texture");
- return;
- }
-
- /* init base gl_renderbuffer fields */
- _mesa_init_renderbuffer(&trb->Base, name);
- /* plug in our texture_renderbuffer-specific functions */
- trb->Base.Delete = delete_texture_wrapper;
- trb->Base.AllocStorage = NULL; /* illegal! */
- trb->Base.GetRow = texture_get_row;
- trb->Base.GetValues = texture_get_values;
- trb->Base.PutRow = texture_put_row;
- trb->Base.PutRowRGB = texture_put_row_rgb;
- trb->Base.PutMonoRow = texture_put_mono_row;
- trb->Base.PutValues = texture_put_values;
- trb->Base.PutMonoValues = texture_put_mono_values;
-
- /* update attachment point */
- _mesa_reference_renderbuffer(&att->Renderbuffer, &(trb->Base));
-}
-
-/**
- * Update the renderbuffer wrapper for rendering to a texture.
- * For example, update the width, height of the RB based on the texture size,
- * update the internal format info, etc.
- */
-static void
-update_wrapper(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
-{
- struct texture_renderbuffer *trb
- = (struct texture_renderbuffer *) att->Renderbuffer;
- GLuint unused;
-
- (void) ctx;
- ASSERT(trb);
-
- trb->TexImage = _mesa_get_attachment_teximage(att);
- ASSERT(trb->TexImage);
-
- trb->Store = _mesa_get_texel_store_func(trb->TexImage->TexFormat);
- if (!trb->Store) {
- /* we'll never draw into some textures (compressed formats) */
- trb->Store = store_nop;
- }
-
- trb->Fetchf = trb->TexImage->FetchTexelf;
-
- if (att->Texture->Target == GL_TEXTURE_1D_ARRAY_EXT) {
- trb->Yoffset = att->Zoffset;
- trb->Zoffset = 0;
- }
- else {
- trb->Yoffset = 0;
- trb->Zoffset = att->Zoffset;
- }
-
- trb->Base.Width = trb->TexImage->Width;
- trb->Base.Height = trb->TexImage->Height;
- trb->Base.InternalFormat = trb->TexImage->InternalFormat;
- trb->Base.Format = trb->TexImage->TexFormat;
-
- /* XXX may need more special cases here */
- switch (trb->TexImage->TexFormat) {
- case MESA_FORMAT_Z24_S8:
- trb->Base.DataType = GL_UNSIGNED_INT_24_8_EXT;
- trb->Base._BaseFormat = GL_DEPTH_STENCIL;
- break;
- case MESA_FORMAT_S8_Z24:
- trb->Base.DataType = GL_UNSIGNED_INT_8_24_REV_MESA;
- trb->Base._BaseFormat = GL_DEPTH_STENCIL;
- break;
- case MESA_FORMAT_Z24_X8:
- trb->Base.DataType = GL_UNSIGNED_INT_24_8_EXT;
- trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
- break;
- case MESA_FORMAT_X8_Z24:
- trb->Base.DataType = GL_UNSIGNED_INT_8_24_REV_MESA;
- trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
- break;
- case MESA_FORMAT_Z16:
- trb->Base.DataType = GL_UNSIGNED_SHORT;
- trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
- break;
- case MESA_FORMAT_Z32:
- trb->Base.DataType = GL_UNSIGNED_INT;
- trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
- break;
- /* SRGB formats pre EXT_framebuffer_sRGB don't do sRGB translations on FBO readback */
- case MESA_FORMAT_SRGB8:
- trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGB888, _mesa_get_texture_dimensions(att->Texture->Target));
- trb->Base.DataType = CHAN_TYPE;
- trb->Base._BaseFormat = GL_RGBA;
- break;
- case MESA_FORMAT_SRGBA8:
- trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGBA8888, _mesa_get_texture_dimensions(att->Texture->Target));
- trb->Base.DataType = CHAN_TYPE;
- trb->Base._BaseFormat = GL_RGBA;
- break;
- case MESA_FORMAT_SARGB8:
- trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_ARGB8888, _mesa_get_texture_dimensions(att->Texture->Target));
- trb->Base.DataType = CHAN_TYPE;
- trb->Base._BaseFormat = GL_RGBA;
- break;
- default:
- _mesa_format_to_type_and_comps(trb->TexImage->TexFormat,
- &trb->Base.DataType, &unused);
- trb->Base._BaseFormat =
- _mesa_base_fbo_format(ctx, trb->TexImage->InternalFormat);
- }
- trb->Base.Data = trb->TexImage->Data;
-}
-
-
-
-/**
- * Called when rendering to a texture image begins, or when changing
- * the dest mipmap level, cube face, etc.
- * This is a fallback routine for software render-to-texture.
- *
- * Called via the glRenderbufferTexture1D/2D/3D() functions
- * and elsewhere (such as glTexImage2D).
- *
- * The image we're rendering into is
- * att->Texture->Image[att->CubeMapFace][att->TextureLevel];
- * It'll never be NULL.
- *
- * \param fb the framebuffer object the texture is being bound to
- * \param att the fb attachment point of the texture
- *
- * \sa _mesa_framebuffer_renderbuffer
- */
-void
-_mesa_render_texture(struct gl_context *ctx,
- struct gl_framebuffer *fb,
- struct gl_renderbuffer_attachment *att)
-{
- (void) fb;
-
- if (!att->Renderbuffer) {
- wrap_texture(ctx, att);
- }
- update_wrapper(ctx, att);
-}
-
-
-void
-_mesa_finish_render_texture(struct gl_context *ctx,
- struct gl_renderbuffer_attachment *att)
-{
- /* do nothing */
- /* The renderbuffer texture wrapper will get deleted by the
- * normal mechanism for deleting renderbuffers.
- */
- (void) ctx;
- (void) att;
-}
+
+#include "context.h"
+#include "colormac.h"
+#include "fbobject.h"
+#include "macros.h"
+#include "texfetch.h"
+#include "teximage.h"
+#include "texrender.h"
+#include "renderbuffer.h"
+
+
+/*
+ * Render-to-texture code for GL_EXT_framebuffer_object
+ */
+
+
+/**
+ * Derived from gl_renderbuffer class
+ */
+struct texture_renderbuffer
+{
+ struct gl_renderbuffer Base; /**< Base class object */
+ struct gl_texture_image *TexImage;
+ StoreTexelFunc Store;
+ FetchTexelFuncF Fetchf;
+ GLint Yoffset; /**< Layer for 1D array textures. */
+ GLint Zoffset; /**< Layer for 2D array textures, or slice
+ * for 3D textures
+ */
+};
+
+
+/**
+ * Get row of values from the renderbuffer that wraps a texture image.
+ */
+static void
+texture_get_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ GLint x, GLint y, void *values)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ ASSERT(trb->TexImage->Width == rb->Width);
+ ASSERT(trb->TexImage->Height == rb->Height);
+
+ y += trb->Yoffset;
+
+ if (rb->DataType == CHAN_TYPE) {
+ GLchan *rgbaOut = (GLchan *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat rgba[4];
+ trb->Fetchf(trb->TexImage, x + i, y, z, rgba);
+ UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ GLushort *zValues = (GLushort *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
+ zValues[i] = (GLushort) (flt * 0xffff);
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ GLuint *zValues = (GLuint *) values;
+ /*
+ const GLdouble scale = (GLdouble) 0xffffffff;
+ */
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
+#if 0
+ /* this should work, but doesn't (overflow due to low precision) */
+ zValues[i] = (GLuint) (flt * scale);
+#else
+ /* temporary hack */
+ zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
+#endif
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ GLuint *zValues = (GLuint *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
+ zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ GLuint *zValues = (GLuint *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x + i, y, z, &flt);
+ zValues[i] = (GLuint) (flt * 0xffffff);
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_get_row");
+ }
+}
+
+
+static void
+texture_get_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ const GLint x[], const GLint y[], void *values)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ if (rb->DataType == CHAN_TYPE) {
+ GLchan *rgbaOut = (GLchan *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat rgba[4];
+ trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+ z, rgba);
+ UNCLAMPED_FLOAT_TO_RGBA_CHAN(rgbaOut + 4 * i, rgba);
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ GLushort *zValues = (GLushort *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+ z, &flt);
+ zValues[i] = (GLushort) (flt * 0xffff);
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ GLuint *zValues = (GLuint *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+ z, &flt);
+#if 0
+ zValues[i] = (GLuint) (flt * 0xffffffff);
+#else
+ zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
+#endif
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ GLuint *zValues = (GLuint *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+ z, &flt);
+ zValues[i] = ((GLuint) (flt * 0xffffff)) << 8;
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ GLuint *zValues = (GLuint *) values;
+ for (i = 0; i < count; i++) {
+ GLfloat flt;
+ trb->Fetchf(trb->TexImage, x[i], y[i] + trb->Yoffset,
+ z, &flt);
+ zValues[i] = (GLuint) (flt * 0xffffff);
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_get_values");
+ }
+}
+
+
+/**
+ * Put row of values into a renderbuffer that wraps a texture image.
+ */
+static void
+texture_put_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ GLint x, GLint y, const void *values, const GLubyte *mask)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ y += trb->Yoffset;
+
+ if (rb->DataType == CHAN_TYPE) {
+ const GLchan *rgba = (const GLchan *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, rgba);
+ }
+ rgba += 4;
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ const GLushort *zValues = (const GLushort *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_put_row");
+ }
+}
+
+/**
+ * Put row of RGB values into a renderbuffer that wraps a texture image.
+ */
+static void
+texture_put_row_rgb(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ GLint x, GLint y, const void *values, const GLubyte *mask)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ y += trb->Yoffset;
+
+ if (rb->DataType == CHAN_TYPE) {
+ const GLchan *rgb = (const GLchan *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, rgb);
+ }
+ rgb += 3;
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ const GLushort *zValues = (const GLushort *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_put_row");
+ }
+}
+
+
+static void
+texture_put_mono_row(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ GLint x, GLint y, const void *value, const GLubyte *mask)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ y += trb->Yoffset;
+
+ if (rb->DataType == CHAN_TYPE) {
+ const GLchan *rgba = (const GLchan *) value;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, rgba);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ const GLushort zValue = *((const GLushort *) value);
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, &zValue);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ const GLuint zValue = *((const GLuint *) value);
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, &zValue);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ const GLuint zValue = *((const GLuint *) value);
+ const GLfloat flt = (GLfloat) ((zValue >> 8) * (1.0 / 0xffffff));
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ const GLuint zValue = *((const GLuint *) value);
+ const GLfloat flt = (GLfloat) ((zValue & 0xffffff) * (1.0 / 0xffffff));
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x + i, y, z, &flt);
+ }
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_put_mono_row");
+ }
+}
+
+
+static void
+texture_put_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
+ const GLint x[], const GLint y[], const void *values,
+ const GLubyte *mask)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ if (rb->DataType == CHAN_TYPE) {
+ const GLchan *rgba = (const GLchan *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, rgba);
+ }
+ rgba += 4;
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ const GLushort *zValues = (const GLushort *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, zValues + i);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] >> 8) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ const GLuint *zValues = (const GLuint *) values;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ GLfloat flt = (GLfloat) ((zValues[i] & 0xffffff) * (1.0 / 0xffffff));
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
+ }
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_put_values");
+ }
+}
+
+
+static void
+texture_put_mono_values(struct gl_context *ctx, struct gl_renderbuffer *rb,
+ GLuint count, const GLint x[], const GLint y[],
+ const void *value, const GLubyte *mask)
+{
+ const struct texture_renderbuffer *trb
+ = (const struct texture_renderbuffer *) rb;
+ const GLint z = trb->Zoffset;
+ GLuint i;
+
+ if (rb->DataType == CHAN_TYPE) {
+ const GLchan *rgba = (const GLchan *) value;
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, rgba);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT) {
+ const GLuint zValue = *((const GLuint *) value);
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &zValue);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_SHORT) {
+ const GLushort zValue = *((const GLushort *) value);
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &zValue);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_24_8_EXT) {
+ const GLuint zValue = *((const GLuint *) value);
+ const GLfloat flt = (GLfloat) ((zValue >> 8) * (1.0 / 0xffffff));
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
+ }
+ }
+ }
+ else if (rb->DataType == GL_UNSIGNED_INT_8_24_REV_MESA) {
+ const GLuint zValue = *((const GLuint *) value);
+ const GLfloat flt = (GLfloat) ((zValue & 0xffffff) * (1.0 / 0xffffff));
+ for (i = 0; i < count; i++) {
+ if (!mask || mask[i]) {
+ trb->Store(trb->TexImage, x[i], y[i] + trb->Yoffset, z, &flt);
+ }
+ }
+ }
+ else {
+ _mesa_problem(ctx, "invalid rb->DataType in texture_put_mono_values");
+ }
+}
+
+
+static void
+store_nop(struct gl_texture_image *texImage,
+ GLint col, GLint row, GLint img,
+ const void *texel)
+{
+}
+
+
+static void
+delete_texture_wrapper(struct gl_renderbuffer *rb)
+{
+ ASSERT(rb->RefCount == 0);
+ free(rb);
+}
+
+
+/**
+ * This function creates a renderbuffer object which wraps a texture image.
+ * The new renderbuffer is plugged into the given attachment point.
+ * This allows rendering into the texture as if it were a renderbuffer.
+ */
+static void
+wrap_texture(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
+{
+ struct texture_renderbuffer *trb;
+ const GLuint name = 0;
+
+ ASSERT(att->Type == GL_TEXTURE);
+ ASSERT(att->Renderbuffer == NULL);
+
+ trb = CALLOC_STRUCT(texture_renderbuffer);
+ if (!trb) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "wrap_texture");
+ return;
+ }
+
+ /* init base gl_renderbuffer fields */
+ _mesa_init_renderbuffer(&trb->Base, name);
+ /* plug in our texture_renderbuffer-specific functions */
+ trb->Base.Delete = delete_texture_wrapper;
+ trb->Base.AllocStorage = NULL; /* illegal! */
+ trb->Base.GetRow = texture_get_row;
+ trb->Base.GetValues = texture_get_values;
+ trb->Base.PutRow = texture_put_row;
+ trb->Base.PutRowRGB = texture_put_row_rgb;
+ trb->Base.PutMonoRow = texture_put_mono_row;
+ trb->Base.PutValues = texture_put_values;
+ trb->Base.PutMonoValues = texture_put_mono_values;
+
+ /* update attachment point */
+ _mesa_reference_renderbuffer(&att->Renderbuffer, &(trb->Base));
+}
+
+/**
+ * Update the renderbuffer wrapper for rendering to a texture.
+ * For example, update the width, height of the RB based on the texture size,
+ * update the internal format info, etc.
+ */
+static void
+update_wrapper(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
+{
+ struct texture_renderbuffer *trb
+ = (struct texture_renderbuffer *) att->Renderbuffer;
+
+ (void) ctx;
+ ASSERT(trb);
+
+ trb->TexImage = _mesa_get_attachment_teximage(att);
+ ASSERT(trb->TexImage);
+
+ trb->Store = _mesa_get_texel_store_func(trb->TexImage->TexFormat);
+ if (!trb->Store) {
+ /* we'll never draw into some textures (compressed formats) */
+ trb->Store = store_nop;
+ }
+
+ trb->Fetchf = trb->TexImage->FetchTexelf;
+
+ if (att->Texture->Target == GL_TEXTURE_1D_ARRAY_EXT) {
+ trb->Yoffset = att->Zoffset;
+ trb->Zoffset = 0;
+ }
+ else {
+ trb->Yoffset = 0;
+ trb->Zoffset = att->Zoffset;
+ }
+
+ trb->Base.Width = trb->TexImage->Width;
+ trb->Base.Height = trb->TexImage->Height;
+ trb->Base.InternalFormat = trb->TexImage->InternalFormat;
+ trb->Base.Format = trb->TexImage->TexFormat;
+
+ /* XXX may need more special cases here */
+ switch (trb->TexImage->TexFormat) {
+ case MESA_FORMAT_Z24_S8:
+ trb->Base.DataType = GL_UNSIGNED_INT_24_8_EXT;
+ trb->Base._BaseFormat = GL_DEPTH_STENCIL;
+ break;
+ case MESA_FORMAT_S8_Z24:
+ trb->Base.DataType = GL_UNSIGNED_INT_8_24_REV_MESA;
+ trb->Base._BaseFormat = GL_DEPTH_STENCIL;
+ break;
+ case MESA_FORMAT_Z24_X8:
+ trb->Base.DataType = GL_UNSIGNED_INT_24_8_EXT;
+ trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
+ break;
+ case MESA_FORMAT_X8_Z24:
+ trb->Base.DataType = GL_UNSIGNED_INT_8_24_REV_MESA;
+ trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
+ break;
+ case MESA_FORMAT_Z16:
+ trb->Base.DataType = GL_UNSIGNED_SHORT;
+ trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
+ break;
+ case MESA_FORMAT_Z32:
+ trb->Base.DataType = GL_UNSIGNED_INT;
+ trb->Base._BaseFormat = GL_DEPTH_COMPONENT;
+ break;
+ /* SRGB formats pre EXT_framebuffer_sRGB don't do sRGB translations on FBO readback */
+ case MESA_FORMAT_SRGB8:
+ trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGB888, _mesa_get_texture_dimensions(att->Texture->Target));
+ trb->Base.DataType = CHAN_TYPE;
+ trb->Base._BaseFormat = GL_RGBA;
+ break;
+ case MESA_FORMAT_SRGBA8:
+ trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_RGBA8888, _mesa_get_texture_dimensions(att->Texture->Target));
+ trb->Base.DataType = CHAN_TYPE;
+ trb->Base._BaseFormat = GL_RGBA;
+ break;
+ case MESA_FORMAT_SARGB8:
+ trb->Fetchf = _mesa_get_texel_fetch_func(MESA_FORMAT_ARGB8888, _mesa_get_texture_dimensions(att->Texture->Target));
+ trb->Base.DataType = CHAN_TYPE;
+ trb->Base._BaseFormat = GL_RGBA;
+ break;
+ default:
+ trb->Base.DataType = CHAN_TYPE;
+ trb->Base._BaseFormat = GL_RGBA;
+ }
+ trb->Base.Data = trb->TexImage->Data;
+}
+
+
+
+/**
+ * Called when rendering to a texture image begins, or when changing
+ * the dest mipmap level, cube face, etc.
+ * This is a fallback routine for software render-to-texture.
+ *
+ * Called via the glRenderbufferTexture1D/2D/3D() functions
+ * and elsewhere (such as glTexImage2D).
+ *
+ * The image we're rendering into is
+ * att->Texture->Image[att->CubeMapFace][att->TextureLevel];
+ * It'll never be NULL.
+ *
+ * \param fb the framebuffer object the texture is being bound to
+ * \param att the fb attachment point of the texture
+ *
+ * \sa _mesa_framebuffer_renderbuffer
+ */
+void
+_mesa_render_texture(struct gl_context *ctx,
+ struct gl_framebuffer *fb,
+ struct gl_renderbuffer_attachment *att)
+{
+ (void) fb;
+
+ if (!att->Renderbuffer) {
+ wrap_texture(ctx, att);
+ }
+ update_wrapper(ctx, att);
+}
+
+
+void
+_mesa_finish_render_texture(struct gl_context *ctx,
+ struct gl_renderbuffer_attachment *att)
+{
+ /* do nothing */
+ /* The renderbuffer texture wrapper will get deleted by the
+ * normal mechanism for deleting renderbuffers.
+ */
+ (void) ctx;
+ (void) att;
+}
diff --git a/pixman/test/composite.c b/pixman/test/composite.c
index 9a001e519..edea9a96b 100644
--- a/pixman/test/composite.c
+++ b/pixman/test/composite.c
@@ -877,7 +877,7 @@ main (int argc, char **argv)
{
#define N_TESTS (8 * 1024 * 1024)
int result = 0;
- uint32_t i;
+ uint32_t i, seed;
if (argc > 1)
{
@@ -899,8 +899,6 @@ main (int argc, char **argv)
}
}
- uint32_t seed;
-
if (getenv ("PIXMAN_RANDOMIZE_TESTS"))
seed = get_random_seed();
else
diff --git a/xorg-server/xkeyboard-config/configure.in b/xorg-server/xkeyboard-config/configure.in
index d272aa1bc..f692d5ba2 100644
--- a/xorg-server/xkeyboard-config/configure.in
+++ b/xorg-server/xkeyboard-config/configure.in
@@ -1,124 +1,124 @@
-AC_INIT(xkeyboard-config, 2.2)
-AC_CONFIG_SRCDIR(rules/base.xml.in)
-AM_INIT_AUTOMAKE([foreign dist-bzip2])
-AM_MAINTAINER_MODE
-
-AC_SUBST(VERSION)
-
-AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
-if test x$XKBCOMP = xnot_found ; then
- AC_ERROR([xkbcomp is required to install the xkb data files])
-fi
-
-AC_ARG_WITH( xkb_base,
- [AS_HELP_STRING([--with-xkb-base=DIR],[XKB base path @<:@DATADIR/X11/xkb@:>@])],
- xkb_base="$withval",
- xkb_base="${datadir}/X11/xkb" )
-
-AC_ARG_WITH( xkb_rules_symlink,
- [ --with-xkb-rules-symlink=NAME1(,NAME2)* create symlink(s) to "old style" rules files (xfree86 and/or xorg)],
- xkb_rules_symlink="$withval" )
-
-AC_ARG_ENABLE( compat_rules,
- [ --enable-compat-rules create compatibility rules],
- enable_compat_rules="$enableval",
- enable_compat_rules="yes" )
-
-# xkeyboard-config does not have build-time dependencies. However, it does
-# have run-time dependencies and keyboard layouts may not work without the
-# right libX11 or xproto installed.
-# By default, we enable these run-time dependencies as build-time
-# dependencies so that those building on their local machines are warned
-# that the resulting build may not work.
-AC_ARG_ENABLE( runtime-deps,
- [ --enable-runtime-deps use run-time dependencies as build-time dependencies],
- enable_runtime_deps="$enableval",
- enable_runtime_deps="yes")
-
-if test "x$enable_runtime_deps" = "xyes"; then
- PKG_CHECK_MODULES(DEPS, [xproto >= 7.0.20] [x11 >= 1.4.3], [have_deps=yes], [have_deps=no])
- if test "x$have_deps" = "xno" ; then
- AC_MSG_WARN([
- Required dependencies not found. These dependencies are
- run-time dependencies only and not required for building.
- Skip this check with --disable-runtime-deps.
-
- Installing this version of xkeyboard-config on a host
- without the required dependencies may result in unusable
- keyboard layouts.
- ])
-
- AC_MSG_ERROR([$DEPS_PKG_ERRORS])
- fi
-fi
-
-AM_CONDITIONAL(CREATE_RULES_SYMLINK, test "x$xkb_rules_symlink" != "x")
-
-AM_CONDITIONAL(USE_COMPAT_RULES, test "x$enable_compat_rules" = "xyes")
-
-# ****
-# i18n
-# ****
-AC_PROG_INTLTOOL(0.30)
-
-GETTEXT_PACKAGE=xkeyboard-config
-AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
-
-AM_GLIB_GNU_GETTEXT
-
-ALL_LINGUAS="af az bg ca crh cs da de el en_GB eo es fi fr gl hu id it ka ko ky lt nb nl pl ro ru rw sk sl sq sr sv tr uk vi zh_CN zh_TW"
-
-AC_SUBST(xkb_base)
-AC_SUBST(xkb_rules_symlink)
-
-AC_OUTPUT([ po/Makefile.in
-Makefile
-compat/Makefile
-geometry/Makefile
-geometry/digital_vndr/Makefile
-geometry/sgi_vndr/Makefile
-keycodes/Makefile
-keycodes/digital_vndr/Makefile
-keycodes/sgi_vndr/Makefile
-keymap/Makefile
-keymap/digital_vndr/Makefile
-keymap/sgi_vndr/Makefile
-keymap/sun_vndr/Makefile
-semantics/Makefile
-rules/Makefile
-rules/bin/Makefile
-rules/compat/Makefile
-symbols/Makefile
-symbols/digital_vndr/Makefile
-symbols/fujitsu_vndr/Makefile
-symbols/hp_vndr/Makefile
-symbols/macintosh_vndr/Makefile
-symbols/nec_vndr/Makefile
-symbols/nokia_vndr/Makefile
-symbols/sgi_vndr/Makefile
-symbols/sony_vndr/Makefile
-symbols/sun_vndr/Makefile
-symbols/xfree68_vndr/Makefile
-types/Makefile
-xkeyboard-config.pc
-xkeyboard-config.spec
-docs/Makefile
-])
-
-echo '***********************************************************'
-echo " $PACKAGE_NAME is configured with the following parameters:"
-echo " XKB base directory: $xkb_base"
-if test -z "$xkb_rules_symlink" ; then
- echo " Symbolic link(s) to legacy rules are not created"
-else
- echo " Symbolic link(s) to legacy rules: $xkb_rules_symlink"
-fi
-
-if test "$enable_compat_rules" = "yes" ; then
- echo " Compatibility rules are included"
-else
- echo " Compatibility rules are not included"
-fi
-echo '***********************************************************'
-
+AC_INIT(xkeyboard-config, 2.3)
+AC_CONFIG_SRCDIR(rules/base.xml.in)
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+AC_SUBST(VERSION)
+
+AC_PATH_PROG([XKBCOMP], [xkbcomp], [not_found])
+if test x$XKBCOMP = xnot_found ; then
+ AC_ERROR([xkbcomp is required to install the xkb data files])
+fi
+
+AC_ARG_WITH( xkb_base,
+ [AS_HELP_STRING([--with-xkb-base=DIR],[XKB base path @<:@DATADIR/X11/xkb@:>@])],
+ xkb_base="$withval",
+ xkb_base="${datadir}/X11/xkb" )
+
+AC_ARG_WITH( xkb_rules_symlink,
+ [ --with-xkb-rules-symlink=NAME1(,NAME2)* create symlink(s) to "old style" rules files (xfree86 and/or xorg)],
+ xkb_rules_symlink="$withval" )
+
+AC_ARG_ENABLE( compat_rules,
+ [ --enable-compat-rules create compatibility rules],
+ enable_compat_rules="$enableval",
+ enable_compat_rules="yes" )
+
+# xkeyboard-config does not have build-time dependencies. However, it does
+# have run-time dependencies and keyboard layouts may not work without the
+# right libX11 or xproto installed.
+# By default, we enable these run-time dependencies as build-time
+# dependencies so that those building on their local machines are warned
+# that the resulting build may not work.
+AC_ARG_ENABLE( runtime-deps,
+ [ --enable-runtime-deps use run-time dependencies as build-time dependencies],
+ enable_runtime_deps="$enableval",
+ enable_runtime_deps="yes")
+
+if test "x$enable_runtime_deps" = "xyes"; then
+ PKG_CHECK_MODULES(DEPS, [xproto >= 7.0.20] [x11 >= 1.4.3], [have_deps=yes], [have_deps=no])
+ if test "x$have_deps" = "xno" ; then
+ AC_MSG_WARN([
+ Required dependencies not found. These dependencies are
+ run-time dependencies only and not required for building.
+ Skip this check with --disable-runtime-deps.
+
+ Installing this version of xkeyboard-config on a host
+ without the required dependencies may result in unusable
+ keyboard layouts.
+ ])
+
+ AC_MSG_ERROR([$DEPS_PKG_ERRORS])
+ fi
+fi
+
+AM_CONDITIONAL(CREATE_RULES_SYMLINK, test "x$xkb_rules_symlink" != "x")
+
+AM_CONDITIONAL(USE_COMPAT_RULES, test "x$enable_compat_rules" = "xyes")
+
+# ****
+# i18n
+# ****
+AC_PROG_INTLTOOL(0.30)
+
+GETTEXT_PACKAGE=xkeyboard-config
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
+
+AM_GLIB_GNU_GETTEXT
+
+ALL_LINGUAS="af az bg ca crh cs da de el en_GB eo es fi fr gl hu id it ka ko ky lt nb nl pl ro ru rw sk sl sq sr sv tr uk vi zh_CN zh_TW"
+
+AC_SUBST(xkb_base)
+AC_SUBST(xkb_rules_symlink)
+
+AC_OUTPUT([ po/Makefile.in
+Makefile
+compat/Makefile
+geometry/Makefile
+geometry/digital_vndr/Makefile
+geometry/sgi_vndr/Makefile
+keycodes/Makefile
+keycodes/digital_vndr/Makefile
+keycodes/sgi_vndr/Makefile
+keymap/Makefile
+keymap/digital_vndr/Makefile
+keymap/sgi_vndr/Makefile
+keymap/sun_vndr/Makefile
+semantics/Makefile
+rules/Makefile
+rules/bin/Makefile
+rules/compat/Makefile
+symbols/Makefile
+symbols/digital_vndr/Makefile
+symbols/fujitsu_vndr/Makefile
+symbols/hp_vndr/Makefile
+symbols/macintosh_vndr/Makefile
+symbols/nec_vndr/Makefile
+symbols/nokia_vndr/Makefile
+symbols/sgi_vndr/Makefile
+symbols/sony_vndr/Makefile
+symbols/sun_vndr/Makefile
+symbols/xfree68_vndr/Makefile
+types/Makefile
+xkeyboard-config.pc
+xkeyboard-config.spec
+docs/Makefile
+])
+
+echo '***********************************************************'
+echo " $PACKAGE_NAME is configured with the following parameters:"
+echo " XKB base directory: $xkb_base"
+if test -z "$xkb_rules_symlink" ; then
+ echo " Symbolic link(s) to legacy rules are not created"
+else
+ echo " Symbolic link(s) to legacy rules: $xkb_rules_symlink"
+fi
+
+if test "$enable_compat_rules" = "yes" ; then
+ echo " Compatibility rules are included"
+else
+ echo " Compatibility rules are not included"
+fi
+echo '***********************************************************'
+
diff --git a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
index 8d1585be4..60c2c94e7 100644
--- a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
+++ b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-04-03 20:43+0100\n"
+"POT-Creation-Date: 2011-05-17 21:08+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -94,155 +94,155 @@ msgid "Advance Scorpius KI"
msgstr ""
#: ../rules/base.xml.in.h:18
-msgid "Afg"
-msgstr ""
-
-#: ../rules/base.xml.in.h:19
msgid "Afghani"
msgstr ""
-#: ../rules/base.xml.in.h:20
+#: ../rules/base.xml.in.h:19
msgid "Akan"
msgstr ""
-#: ../rules/base.xml.in.h:21
+#: ../rules/base.xml.in.h:20
msgid "Albanian"
msgstr ""
-#: ../rules/base.xml.in.h:22
+#: ../rules/base.xml.in.h:21
msgid "Alt and Meta are on Alt keys"
msgstr ""
-#: ../rules/base.xml.in.h:23
+#: ../rules/base.xml.in.h:22
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr ""
-#: ../rules/base.xml.in.h:24
+#: ../rules/base.xml.in.h:23
msgid "Alt+Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:25
+#: ../rules/base.xml.in.h:24
msgid "Alt+Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:26
+#: ../rules/base.xml.in.h:25
msgid "Alt+Shift"
msgstr ""
-#: ../rules/base.xml.in.h:27
+#: ../rules/base.xml.in.h:26
msgid "Alt+Space"
msgstr ""
-#: ../rules/base.xml.in.h:28
+#: ../rules/base.xml.in.h:27
msgid "Alt/Win key behavior"
msgstr ""
-#: ../rules/base.xml.in.h:29
+#: ../rules/base.xml.in.h:28
msgid "Amharic"
msgstr ""
-#: ../rules/base.xml.in.h:30
+#: ../rules/base.xml.in.h:29
msgid "Any Alt key"
msgstr ""
-#: ../rules/base.xml.in.h:31
+#: ../rules/base.xml.in.h:30
msgid "Any Win key"
msgstr ""
-#: ../rules/base.xml.in.h:32
+#: ../rules/base.xml.in.h:31
msgid "Any Win key (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:33
+#: ../rules/base.xml.in.h:32
msgid "Apple"
msgstr ""
-#: ../rules/base.xml.in.h:34
+#: ../rules/base.xml.in.h:33
msgid "Apple Aluminium Keyboard (ANSI)"
msgstr ""
-#: ../rules/base.xml.in.h:35
+#: ../rules/base.xml.in.h:34
msgid "Apple Aluminium Keyboard (ISO)"
msgstr ""
-#: ../rules/base.xml.in.h:36
+#: ../rules/base.xml.in.h:35
msgid "Apple Aluminium Keyboard (JIS)"
msgstr ""
-#: ../rules/base.xml.in.h:37
+#: ../rules/base.xml.in.h:36
msgid ""
"Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num "
"Lock)"
msgstr ""
-#: ../rules/base.xml.in.h:38
+#: ../rules/base.xml.in.h:37
msgid "Apple Laptop"
msgstr ""
-#: ../rules/base.xml.in.h:39
+#: ../rules/base.xml.in.h:38
msgid "Arabic"
msgstr ""
-#: ../rules/base.xml.in.h:40
+#: ../rules/base.xml.in.h:39
msgid "Arabic (Buckwalter)"
msgstr ""
-#: ../rules/base.xml.in.h:41
+#: ../rules/base.xml.in.h:40
msgid "Arabic (Morocco)"
msgstr ""
-#: ../rules/base.xml.in.h:42
+#: ../rules/base.xml.in.h:41
msgid "Arabic (Pakistan)"
msgstr ""
-#: ../rules/base.xml.in.h:43
+#: ../rules/base.xml.in.h:42
msgid "Arabic (Syria)"
msgstr ""
-#: ../rules/base.xml.in.h:44
+#: ../rules/base.xml.in.h:43
msgid "Arabic (azerty)"
msgstr ""
-#: ../rules/base.xml.in.h:45
+#: ../rules/base.xml.in.h:44
msgid "Arabic (azerty/digits)"
msgstr ""
-#: ../rules/base.xml.in.h:46
+#: ../rules/base.xml.in.h:45
msgid "Arabic (digits)"
msgstr ""
-#: ../rules/base.xml.in.h:47
+#: ../rules/base.xml.in.h:46
msgid "Arabic (qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:48
+#: ../rules/base.xml.in.h:47
msgid "Arabic (qwerty/digits)"
msgstr ""
-#: ../rules/base.xml.in.h:49
+#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
msgid "Armenian"
msgstr ""
-#: ../rules/base.xml.in.h:50
+#: ../rules/base.xml.in.h:49
msgid "Armenian (alternative eastern)"
msgstr ""
-#: ../rules/base.xml.in.h:51
+#: ../rules/base.xml.in.h:50 ../rules/base.extras.xml.in.h:3
msgid "Armenian (alternative phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:52
+#: ../rules/base.xml.in.h:51
msgid "Armenian (eastern)"
msgstr ""
-#: ../rules/base.xml.in.h:53
+#: ../rules/base.xml.in.h:52
msgid "Armenian (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:54
+#: ../rules/base.xml.in.h:53
msgid "Armenian (western)"
msgstr ""
+#: ../rules/base.xml.in.h:54
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr ""
+
#: ../rules/base.xml.in.h:55
msgid "Asus Laptop"
msgstr ""
@@ -260,11 +260,11 @@ msgid "Avatime"
msgstr ""
#: ../rules/base.xml.in.h:59
-msgid "Azerbaijan (Cyrillic)"
+msgid "Azerbaijani"
msgstr ""
#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani"
+msgid "Azerbaijani (Cyrillic)"
msgstr ""
#: ../rules/base.xml.in.h:61
@@ -313,7 +313,7 @@ msgstr ""
#: ../rules/base.xml.in.h:72
msgid ""
-"Backslash chooses 3rd level, latches when pressed together with another 3rd-"
+"Backslash (chooses 3rd level, latches when pressed together with another 3rd-"
"level-chooser)"
msgstr ""
@@ -322,3485 +322,3477 @@ msgid "Bambara"
msgstr ""
#: ../rules/base.xml.in.h:74
-msgid "Belarusian"
+msgid "Bashkirian"
msgstr ""
#: ../rules/base.xml.in.h:75
-msgid "Belarusian (Latin)"
+msgid "Belarusian"
msgstr ""
#: ../rules/base.xml.in.h:76
-msgid "Belarusian (legacy)"
+msgid "Belarusian (Latin)"
msgstr ""
#: ../rules/base.xml.in.h:77
-msgid "Belgian"
+msgid "Belarusian (legacy)"
msgstr ""
#: ../rules/base.xml.in.h:78
-msgid "Belgian (ISO alternate)"
+msgid "Belgian"
msgstr ""
#: ../rules/base.xml.in.h:79
-msgid "Belgian (Sun dead keys)"
+msgid "Belgian (ISO alternate)"
msgstr ""
#: ../rules/base.xml.in.h:80
-msgid "Belgian (Wang model 724 azerty)"
+msgid "Belgian (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:81
-msgid "Belgian (alternative)"
+msgid "Belgian (Wang model 724 azerty)"
msgstr ""
#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative, Sun dead keys)"
+msgid "Belgian (alternative)"
msgstr ""
#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, latin-9 only)"
+msgid "Belgian (alternative, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:84
-msgid "Belgian (eliminate dead keys)"
+msgid "Belgian (alternative, latin-9 only)"
msgstr ""
#: ../rules/base.xml.in.h:85
-msgid "BenQ X-Touch"
+msgid "Belgian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch 730"
+msgid "BenQ X-Touch"
msgstr ""
#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 800"
+msgid "BenQ X-Touch 730"
msgstr ""
#: ../rules/base.xml.in.h:88
-msgid "Bengali"
+msgid "BenQ X-Touch 800"
msgstr ""
#: ../rules/base.xml.in.h:89
-msgid "Bengali (Probhat)"
+msgid "Bengali"
msgstr ""
#: ../rules/base.xml.in.h:90
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgid "Bengali (Probhat)"
msgstr ""
#: ../rules/base.xml.in.h:91
-msgid "Berber (Morocco, Tifinagh alternative)"
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:92
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgid "Berber (Morocco, Tifinagh alternative)"
msgstr ""
#: ../rules/base.xml.in.h:93
-msgid "Berber (Morocco, Tifinagh extended)"
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:94
-msgid "Berber (Morocco, Tifinagh phonetic)"
+msgid "Berber (Morocco, Tifinagh extended)"
msgstr ""
#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh)"
+msgid "Berber (Morocco, Tifinagh phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:96
-msgid "Bosnian"
+msgid "Berber (Morocco, Tifinagh)"
msgstr ""
#: ../rules/base.xml.in.h:97
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgid "Bosnian"
msgstr ""
#: ../rules/base.xml.in.h:98
-msgid "Bosnian (US keyboard with Bosnian letters)"
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
msgstr ""
#: ../rules/base.xml.in.h:99
-msgid "Bosnian (use Bosnian digraphs)"
+msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr ""
#: ../rules/base.xml.in.h:100
-msgid "Bosnian (use guillemets for quotes)"
+msgid "Bosnian (use Bosnian digraphs)"
msgstr ""
#: ../rules/base.xml.in.h:101
-msgid "Both Alt keys together"
+msgid "Bosnian (use guillemets for quotes)"
msgstr ""
#: ../rules/base.xml.in.h:102
-msgid "Both Ctrl keys together"
+msgid "Both Alt keys together"
msgstr ""
#: ../rules/base.xml.in.h:103
-msgid "Both Shift keys together"
+msgid "Both Ctrl keys together"
msgstr ""
#: ../rules/base.xml.in.h:104
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+msgid "Both Shift keys together"
msgstr ""
#: ../rules/base.xml.in.h:105
-msgid "Both Shift-Keys together toggle Caps Lock"
+msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
msgstr ""
#: ../rules/base.xml.in.h:106
-msgid "Both Shift-Keys together toggle ShiftLock"
+msgid "Both Shift-Keys together toggle Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:107
-msgid "Braille"
+msgid "Both Shift-Keys together toggle ShiftLock"
msgstr ""
#: ../rules/base.xml.in.h:108
-msgid "Braille (left hand)"
+msgid "Braille"
msgstr ""
#: ../rules/base.xml.in.h:109
-msgid "Braille (right hand)"
+msgid "Braille (left hand)"
msgstr ""
#: ../rules/base.xml.in.h:110
-msgid "Brother Internet Keyboard"
+msgid "Braille (right hand)"
msgstr ""
#: ../rules/base.xml.in.h:111
-msgid "Bulgarian"
+msgid "Brother Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:112
-msgid "Bulgarian (new phonetic)"
+msgid "Bulgarian"
msgstr ""
#: ../rules/base.xml.in.h:113
-msgid "Bulgarian (traditional phonetic)"
+msgid "Bulgarian (new phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:114
-msgid "Burmese"
+msgid "Bulgarian (traditional phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:115
-msgid "Canadian Multilingual"
+msgid "Burmese"
msgstr ""
#: ../rules/base.xml.in.h:116
-msgid "Canadian Multilingual (first part)"
+msgid "Canadian Multilingual"
msgstr ""
#: ../rules/base.xml.in.h:117
-msgid "Canadian Multilingual (second part)"
+msgid "Canadian Multilingual (first part)"
msgstr ""
#: ../rules/base.xml.in.h:118
-msgid "Caps Lock"
+msgid "Canadian Multilingual (second part)"
msgstr ""
#: ../rules/base.xml.in.h:119
+msgid "Caps Lock"
+msgstr ""
+
+#: ../rules/base.xml.in.h:120
msgid ""
"Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-"
"level-chooser)"
msgstr ""
-#: ../rules/base.xml.in.h:120
+#: ../rules/base.xml.in.h:121
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr ""
-#: ../rules/base.xml.in.h:121
+#: ../rules/base.xml.in.h:122
msgid ""
"Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr ""
-#: ../rules/base.xml.in.h:122
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr ""
-
#: ../rules/base.xml.in.h:123
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:124
-msgid "Caps Lock is disabled"
+msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:125
-msgid "Caps Lock key behavior"
+msgid "Caps Lock is disabled"
msgstr ""
#: ../rules/base.xml.in.h:126
-msgid "Caps Lock toggles Shift so all keys are affected"
+msgid "Caps Lock key behavior"
msgstr ""
#: ../rules/base.xml.in.h:127
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgid "Caps Lock toggles Shift so all keys are affected"
msgstr ""
#: ../rules/base.xml.in.h:128
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr ""
#: ../rules/base.xml.in.h:129
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:130
-msgid "Catalan"
+msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:131
-msgid "Cherokee"
+msgid "Catalan"
msgstr ""
#: ../rules/base.xml.in.h:132
-msgid "Cherry B.UNLIMITED"
+msgid "Catalan (Spain, with middle-dot L)"
msgstr ""
#: ../rules/base.xml.in.h:133
-msgid "Cherry Blue Line CyBo@rd"
+msgid "Cherokee"
msgstr ""
#: ../rules/base.xml.in.h:134
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgid "Cherry B.UNLIMITED"
msgstr ""
#: ../rules/base.xml.in.h:135
-msgid "Cherry CyBo@rd USB-Hub"
+msgid "Cherry Blue Line CyBo@rd"
msgstr ""
#: ../rules/base.xml.in.h:136
-msgid "Cherry CyMotion Expert"
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
msgstr ""
#: ../rules/base.xml.in.h:137
-msgid "Cherry CyMotion Master Linux"
+msgid "Cherry CyBo@rd USB-Hub"
msgstr ""
#: ../rules/base.xml.in.h:138
-msgid "Cherry CyMotion Master XPress"
+msgid "Cherry CyMotion Expert"
msgstr ""
#: ../rules/base.xml.in.h:139
-msgid "Chicony Internet Keyboard"
+msgid "Cherry CyMotion Master Linux"
msgstr ""
#: ../rules/base.xml.in.h:140
-msgid "Chicony KB-9885"
+msgid "Cherry CyMotion Master XPress"
msgstr ""
#: ../rules/base.xml.in.h:141
-msgid "Chicony KU-0108"
+msgid "Chicony Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:142
-msgid "Chicony KU-0420"
+msgid "Chicony KB-9885"
msgstr ""
#: ../rules/base.xml.in.h:143
-msgid "Chinese"
+msgid "Chicony KU-0108"
msgstr ""
#: ../rules/base.xml.in.h:144
-msgid "Chinese (Tibetan with ASCII numerals)"
+msgid "Chicony KU-0420"
msgstr ""
#: ../rules/base.xml.in.h:145
-msgid "Chinese (Tibetan)"
+msgid "Chinese"
msgstr ""
#: ../rules/base.xml.in.h:146
-msgid "Chinese (Uyghur)"
+msgid "Chuvash"
msgstr ""
#: ../rules/base.xml.in.h:147
-msgid "Classmate PC"
+msgid "Chuvash (Latin)"
msgstr ""
#: ../rules/base.xml.in.h:148
-msgid "Compaq Easy Access Keyboard"
+msgid "Classmate PC"
msgstr ""
#: ../rules/base.xml.in.h:149
-msgid "Compaq Internet Keyboard (13 keys)"
+msgid "CloGaelach"
msgstr ""
#: ../rules/base.xml.in.h:150
-msgid "Compaq Internet Keyboard (18 keys)"
+msgid "Compaq Easy Access Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:151
-msgid "Compaq Internet Keyboard (7 keys)"
+msgid "Compaq Internet Keyboard (13 keys)"
msgstr ""
#: ../rules/base.xml.in.h:152
-msgid "Compaq iPaq Keyboard"
+msgid "Compaq Internet Keyboard (18 keys)"
msgstr ""
#: ../rules/base.xml.in.h:153
-msgid "Compose key position"
+msgid "Compaq Internet Keyboard (7 keys)"
msgstr ""
#: ../rules/base.xml.in.h:154
-msgid "Control + Alt + Backspace"
+msgid "Compaq iPaq Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:155
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
+msgid "Compose key position"
msgstr ""
#: ../rules/base.xml.in.h:156
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
+msgid "Control + Alt + Backspace"
msgstr ""
#: ../rules/base.xml.in.h:157
-msgid "Creative Desktop Wireless 7000"
+msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
msgstr ""
#: ../rules/base.xml.in.h:158
-msgid "Croatian"
+msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
msgstr ""
#: ../rules/base.xml.in.h:159
-msgid "Croatian (US keyboard with Croatian digraphs)"
+msgid "Creative Desktop Wireless 7000"
msgstr ""
#: ../rules/base.xml.in.h:160
-msgid "Croatian (US keyboard with Croatian letters)"
+msgid "Crimean Tatar (Dobruja Q)"
msgstr ""
#: ../rules/base.xml.in.h:161
-msgid "Croatian (Use Croatian digraphs)"
+msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:162
-msgid "Croatian (Use guillemets for quotes)"
+msgid "Crimean Tatar (Turkish F)"
msgstr ""
#: ../rules/base.xml.in.h:163
-msgid "Ctrl key position"
+msgid "Crimean Tatar (Turkish Q)"
msgstr ""
#: ../rules/base.xml.in.h:164
-msgid "Ctrl+Shift"
+msgid "Croatian"
msgstr ""
#: ../rules/base.xml.in.h:165
-msgid "Czech"
+msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr ""
#: ../rules/base.xml.in.h:166
-msgid "Czech (UCW layout accented letters only)"
+msgid "Croatian (US keyboard with Croatian letters)"
msgstr ""
#: ../rules/base.xml.in.h:167
-msgid "Czech (US Dvorak with CZ UCW support)"
+msgid "Croatian (use Croatian digraphs)"
msgstr ""
#: ../rules/base.xml.in.h:168
-msgid "Czech (With &lt;\\|&gt; key)"
+msgid "Croatian (use guillemets for quotes)"
msgstr ""
#: ../rules/base.xml.in.h:169
-msgid "Czech (qwerty)"
+msgid "Ctrl key position"
msgstr ""
#: ../rules/base.xml.in.h:170
-msgid "Czech (qwerty, extended Backslash)"
+msgid "Ctrl+Shift"
msgstr ""
#: ../rules/base.xml.in.h:171
-msgid "DTK2000"
+msgid "Czech"
msgstr ""
#: ../rules/base.xml.in.h:172
-msgid "Danish"
+msgid "Czech (UCW layout, accented letters only)"
msgstr ""
#: ../rules/base.xml.in.h:173
-msgid "Danish (Dvorak)"
+msgid "Czech (US Dvorak with CZ UCW support)"
msgstr ""
#: ../rules/base.xml.in.h:174
-msgid "Danish (Mac)"
+msgid "Czech (qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:175
-msgid "Danish (Mac, eliminate dead keys)"
+msgid "Czech (qwerty, extended Backslash)"
msgstr ""
#: ../rules/base.xml.in.h:176
-msgid "Danish (eliminate dead keys)"
+msgid "Czech (with &lt;\\|&gt; key)"
msgstr ""
#: ../rules/base.xml.in.h:177
-msgid "Default numeric keypad keys"
+msgid "DTK2000"
msgstr ""
#: ../rules/base.xml.in.h:178
-msgid "Dell"
+msgid "Danish"
msgstr ""
#: ../rules/base.xml.in.h:179
-msgid "Dell 101-key PC"
+msgid "Danish (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:180
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgid "Danish (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:181
-msgid "Dell Laptop/notebook Precision M series"
+msgid "Danish (Macintosh, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:182
-msgid "Dell Latitude series laptop"
+msgid "Danish (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:183
-msgid "Dell Precision M65"
+msgid "Default numeric keypad keys"
msgstr ""
#: ../rules/base.xml.in.h:184
-msgid "Dell SK-8125"
+msgid "Dell"
msgstr ""
#: ../rules/base.xml.in.h:185
-msgid "Dell SK-8135"
+msgid "Dell 101-key PC"
msgstr ""
#: ../rules/base.xml.in.h:186
-msgid "Dell USB Multimedia Keyboard"
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
msgstr ""
#: ../rules/base.xml.in.h:187
-msgid "Dexxa Wireless Desktop Keyboard"
+msgid "Dell Laptop/notebook Precision M series"
msgstr ""
#: ../rules/base.xml.in.h:188
-msgid "Dhivehi"
+msgid "Dell Latitude series laptop"
msgstr ""
#: ../rules/base.xml.in.h:189
-msgid "Diamond 9801 / 9802 series"
+msgid "Dell Precision M65"
msgstr ""
#: ../rules/base.xml.in.h:190
-msgid "Dutch"
+msgid "Dell SK-8125"
msgstr ""
#: ../rules/base.xml.in.h:191
-msgid "Dutch (Mac)"
+msgid "Dell SK-8135"
msgstr ""
#: ../rules/base.xml.in.h:192
-msgid "Dutch (Sun dead keys)"
+msgid "Dell USB Multimedia Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:193
-msgid "Dutch (standard)"
+msgid "Dexxa Wireless Desktop Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:194
-msgid "Dzongkha"
+msgid "Dhivehi"
msgstr ""
#: ../rules/base.xml.in.h:195
-msgid "Enable extra typographic characters"
+msgid "Diamond 9801 / 9802 series"
msgstr ""
#: ../rules/base.xml.in.h:196
-msgid "English (Canada)"
+msgid "Dutch"
msgstr ""
#: ../rules/base.xml.in.h:197
-msgid "English (Colemak)"
+msgid "Dutch (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:198
-msgid "English (Dvorak alternative international no dead keys)"
+msgid "Dutch (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:199
-msgid "English (Dvorak international with dead keys)"
+msgid "Dutch (standard)"
msgstr ""
#: ../rules/base.xml.in.h:200
-msgid "English (Dvorak)"
+msgid "Dzongkha"
msgstr ""
#: ../rules/base.xml.in.h:201
-msgid "English (Ghana)"
+msgid "Enable extra typographic characters"
msgstr ""
#: ../rules/base.xml.in.h:202
-msgid "English (Ghana, GILLBT)"
+msgid "English (Cameroon Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:203
-msgid "English (Ghana, multilingual)"
+msgid "English (Cameroon qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:204
-msgid "English (India, with RupeeSign)"
+msgid "English (Cameroon)"
msgstr ""
#: ../rules/base.xml.in.h:205
-msgid "English (Macintosh)"
+msgid "English (Canada)"
msgstr ""
#: ../rules/base.xml.in.h:206
-msgid "English (Mali, USA Mac)"
+msgid "English (Colemak)"
msgstr ""
#: ../rules/base.xml.in.h:207
-msgid "English (Mali, USA international)"
+msgid "English (Dvorak alternative international no dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:208
-msgid "English (Nigeria)"
+msgid "English (Dvorak international with dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:209
-msgid "English (South Africa)"
+msgid "English (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:210
-msgid "English (UK)"
+msgid "English (Ghana)"
msgstr ""
#: ../rules/base.xml.in.h:211
-msgid "English (UK, Colemak)"
+msgid "English (Ghana, GILLBT)"
msgstr ""
#: ../rules/base.xml.in.h:212
-msgid "English (UK, Dvorak UK punctuation)"
+msgid "English (Ghana, multilingual)"
msgstr ""
#: ../rules/base.xml.in.h:213
-msgid "English (UK, Dvorak)"
+msgid "English (India, with RupeeSign)"
msgstr ""
#: ../rules/base.xml.in.h:214
-msgid "English (UK, Mac international)"
+msgid "English (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:215
-msgid "English (UK, Mac)"
+msgid "English (Mali, US Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:216
-msgid "English (UK, extended, WinKeys)"
+msgid "English (Mali, US international)"
msgstr ""
#: ../rules/base.xml.in.h:217
-msgid "English (UK, international with dead keys)"
+msgid "English (Nigeria)"
msgstr ""
#: ../rules/base.xml.in.h:218
-msgid "English (US)"
+msgid "English (South Africa)"
msgstr ""
#: ../rules/base.xml.in.h:219
-msgid "English (US, alternative international)"
+msgid "English (UK)"
msgstr ""
#: ../rules/base.xml.in.h:220
-msgid "English (US, international with dead keys)"
+msgid "English (UK, Colemak)"
msgstr ""
#: ../rules/base.xml.in.h:221
-msgid "English (US, with euro on 5)"
+msgid "English (UK, Dvorak with UK punctuation)"
msgstr ""
#: ../rules/base.xml.in.h:222
-msgid "English (classic Dvorak)"
+msgid "English (UK, Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:223
-msgid "English (international AltGr dead keys)"
+msgid "English (UK, Macintosh international)"
msgstr ""
#: ../rules/base.xml.in.h:224
-msgid "English (layout toggle on multiply/divide key)"
+msgid "English (UK, Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:225
-msgid "English (left handed Dvorak)"
+msgid "English (UK, extended WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:226
-msgid "English (programmer Dvorak)"
+msgid "English (UK, international with dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:227
-msgid "English (right handed Dvorak)"
+#: ../rules/base.xml.in.h:227 ../rules/base.extras.xml.in.h:7
+msgid "English (US)"
msgstr ""
#: ../rules/base.xml.in.h:228
-msgid "Ennyah DKB-1008"
+msgid "English (US, alternative international)"
msgstr ""
#: ../rules/base.xml.in.h:229
-msgid "Enter on keypad"
+msgid "English (US, international with dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:230
-msgid "Esperanto"
+msgid "English (US, with euro on 5)"
msgstr ""
#: ../rules/base.xml.in.h:231
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgid "English (classic Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:232
-msgid "Estonian"
+msgid "English (international AltGr dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:233
-msgid "Estonian (Dvorak)"
+msgid "English (layout toggle on multiply/divide key)"
msgstr ""
#: ../rules/base.xml.in.h:234
-msgid "Estonian (US keyboard with Estonian letters)"
+msgid "English (left handed Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:235
-msgid "Estonian (eliminate dead keys)"
+msgid "English (programmer Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:236
-msgid "Euro on 2"
+msgid "English (right handed Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:237
-msgid "Euro on 4"
+msgid "Ennyah DKB-1008"
msgstr ""
#: ../rules/base.xml.in.h:238
-msgid "Euro on 5"
+msgid "Enter on keypad"
msgstr ""
#: ../rules/base.xml.in.h:239
-msgid "Euro on E"
+msgid "Esperanto"
msgstr ""
#: ../rules/base.xml.in.h:240
-msgid "Everex STEPnote"
+msgid "Esperanto (Portugal, Nativo)"
msgstr ""
#: ../rules/base.xml.in.h:241
-msgid "Ewe"
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr ""
#: ../rules/base.xml.in.h:242
-msgid "FL90"
+msgid "Estonian"
msgstr ""
#: ../rules/base.xml.in.h:243
-msgid "Faroese"
+msgid "Estonian (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:244
-msgid "Faroese (eliminate dead keys)"
+msgid "Estonian (US keyboard with Estonian letters)"
msgstr ""
#: ../rules/base.xml.in.h:245
-msgid "Filipino"
+msgid "Estonian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:246
-msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgid "Euro on 2"
msgstr ""
#: ../rules/base.xml.in.h:247
-msgid "Filipino (Capewell-Dvorak Latin)"
+msgid "Euro on 4"
msgstr ""
#: ../rules/base.xml.in.h:248
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgid "Euro on 5"
msgstr ""
#: ../rules/base.xml.in.h:249
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgid "Euro on E"
msgstr ""
#: ../rules/base.xml.in.h:250
-msgid "Filipino (Colemak Baybayin)"
+msgid "Everex STEPnote"
msgstr ""
#: ../rules/base.xml.in.h:251
-msgid "Filipino (Colemak Latin)"
+msgid "Ewe"
msgstr ""
#: ../rules/base.xml.in.h:252
-msgid "Filipino (Dvorak Latin)"
+msgid "FL90"
msgstr ""
#: ../rules/base.xml.in.h:253
-msgid "Filipino (QWERTY Baybayin)"
+msgid "Faroese"
msgstr ""
#: ../rules/base.xml.in.h:254
-msgid "Finnish"
+msgid "Faroese (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:255
-msgid "Finnish (Mac)"
+msgid "Filipino"
msgstr ""
#: ../rules/base.xml.in.h:256
-msgid "Finnish (classic)"
+msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr ""
#: ../rules/base.xml.in.h:257
-msgid "Finnish (classic, eliminate dead keys)"
+msgid "Filipino (Capewell-Dvorak Latin)"
msgstr ""
#: ../rules/base.xml.in.h:258
-msgid "Finnish (northern Saami)"
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:259
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:260
+msgid "Filipino (Colemak Baybayin)"
msgstr ""
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
#: ../rules/base.xml.in.h:261
-msgid "Four-level key with abstract separators"
+msgid "Filipino (Colemak Latin)"
msgstr ""
#: ../rules/base.xml.in.h:262
-msgid "Four-level key with comma"
+msgid "Filipino (Dvorak Baybayin)"
msgstr ""
#: ../rules/base.xml.in.h:263
-msgid "Four-level key with dot"
+msgid "Filipino (Dvorak Latin)"
msgstr ""
#: ../rules/base.xml.in.h:264
-msgid "Four-level key with dot, latin-9 restriction"
+msgid "Filipino (QWERTY Baybayin)"
msgstr ""
#: ../rules/base.xml.in.h:265
-msgid "Four-level key with momayyez"
+msgid "Finnish"
msgstr ""
#: ../rules/base.xml.in.h:266
-msgid "French"
+msgid "Finnish (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:267
-msgid "French (Bepo, ergonomic, Dvorak way)"
+msgid "Finnish (classic)"
msgstr ""
#: ../rules/base.xml.in.h:268
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:269
-msgid "French (Breton)"
-msgstr ""
-
-#: ../rules/base.xml.in.h:270
-msgid "French (Canada, Dvorak)"
+msgid "Finnish (classic, eliminate dead keys)"
msgstr ""
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
#: ../rules/base.xml.in.h:271
-msgid "French (Canada, legacy)"
+msgid "Four-level key with abstract separators"
msgstr ""
#: ../rules/base.xml.in.h:272
-msgid "French (Democratic Republic of the Congo)"
+msgid "Four-level key with comma"
msgstr ""
#: ../rules/base.xml.in.h:273
-msgid "French (Dvorak)"
+msgid "Four-level key with dot"
msgstr ""
#: ../rules/base.xml.in.h:274
-msgid "French (Georgian AZERTY Tskapo)"
+msgid "Four-level key with dot, latin-9 restriction"
msgstr ""
#: ../rules/base.xml.in.h:275
-msgid "French (Guinea)"
+msgid "Four-level key with momayyez"
msgstr ""
#: ../rules/base.xml.in.h:276
-msgid "French (Mac)"
+msgid "French"
msgstr ""
#: ../rules/base.xml.in.h:277
-msgid "French (Mali, alternative)"
+msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr ""
#: ../rules/base.xml.in.h:278
-msgid "French (Morocco)"
+msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
msgstr ""
#: ../rules/base.xml.in.h:279
-msgid "French (Occitan)"
+msgid "French (Breton)"
msgstr ""
#: ../rules/base.xml.in.h:280
-msgid "French (Sun dead keys)"
+msgid "French (Cameroon azerty)"
msgstr ""
#: ../rules/base.xml.in.h:281
-msgid "French (Switzerland)"
+msgid "French (Cameroon)"
msgstr ""
-#: ../rules/base.xml.in.h:282
-msgid "French (Switzerland, Mac)"
+#: ../rules/base.xml.in.h:282 ../rules/base.extras.xml.in.h:10
+msgid "French (Canada)"
msgstr ""
#: ../rules/base.xml.in.h:283
-msgid "French (Switzerland, Sun dead keys)"
+msgid "French (Canada, Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:284
-msgid "French (Switzerland, eliminate dead keys)"
+msgid "French (Canada, legacy)"
msgstr ""
#: ../rules/base.xml.in.h:285
-msgid "French (alternative)"
+msgid "French (Democratic Republic of the Congo)"
msgstr ""
#: ../rules/base.xml.in.h:286
-msgid "French (alternative, Sun dead keys)"
+msgid "French (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:287
-msgid "French (alternative, eliminate dead keys)"
+msgid "French (Guinea)"
msgstr ""
#: ../rules/base.xml.in.h:288
-msgid "French (alternative, latin-9 only)"
+msgid "French (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:289
-msgid "French (eliminate dead keys)"
+msgid "French (Mali, alternative)"
msgstr ""
#: ../rules/base.xml.in.h:290
-msgid "French (legacy alternative)"
+msgid "French (Morocco)"
msgstr ""
#: ../rules/base.xml.in.h:291
-msgid "French (legacy, alternative, Sun dead keys)"
+msgid "French (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:292
-msgid "French (legacy, alternative, eliminate dead keys)"
+msgid "French (Switzerland)"
msgstr ""
#: ../rules/base.xml.in.h:293
-msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgid "French (Switzerland, Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:294
-msgid "Fula"
+msgid "French (Switzerland, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:295
-msgid "GBr"
+msgid "French (Switzerland, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:296
-msgid "Ga"
+msgid "French (alternative)"
msgstr ""
#: ../rules/base.xml.in.h:297
-msgid "Generic 101-key PC"
+msgid "French (alternative, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:298
-msgid "Generic 102-key (Intl) PC"
+msgid "French (alternative, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:299
-msgid "Generic 104-key PC"
+msgid "French (alternative, latin-9 only)"
msgstr ""
#: ../rules/base.xml.in.h:300
-msgid "Generic 105-key (Intl) PC"
+msgid "French (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:301
-msgid "Genius Comfy KB-12e"
+msgid "French (legacy, alternative)"
msgstr ""
#: ../rules/base.xml.in.h:302
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgid "French (legacy, alternative, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:303
-msgid "Genius Comfy KB-21e-Scroll"
+msgid "French (legacy, alternative, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:304
-msgid "Genius KB-19e NB"
+msgid "Fujitsu-Siemens Computers AMILO laptop"
msgstr ""
#: ../rules/base.xml.in.h:305
-msgid "Genius KKB-2050HS"
+msgid "Fula"
msgstr ""
#: ../rules/base.xml.in.h:306
-msgid "Georgian"
+msgid "Ga"
msgstr ""
#: ../rules/base.xml.in.h:307
-msgid "Georgian (MESS)"
+msgid "Generic 101-key PC"
msgstr ""
#: ../rules/base.xml.in.h:308
-msgid "Georgian (Ossetian)"
+msgid "Generic 102-key (Intl) PC"
msgstr ""
#: ../rules/base.xml.in.h:309
-msgid "Georgian (ergonomic)"
+msgid "Generic 104-key PC"
msgstr ""
#: ../rules/base.xml.in.h:310
-msgid "German"
+msgid "Generic 105-key (Intl) PC"
msgstr ""
#: ../rules/base.xml.in.h:311
-msgid "German (Austria)"
+msgid "Genius Comfy KB-12e"
msgstr ""
#: ../rules/base.xml.in.h:312
-msgid "German (Austria, Mac)"
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
msgstr ""
#: ../rules/base.xml.in.h:313
-msgid "German (Austria, Sun dead keys)"
+msgid "Genius Comfy KB-21e-Scroll"
msgstr ""
#: ../rules/base.xml.in.h:314
-msgid "German (Austria, eliminate dead keys)"
+msgid "Genius KB-19e NB"
msgstr ""
#: ../rules/base.xml.in.h:315
-msgid "German (Dvorak)"
+msgid "Genius KKB-2050HS"
msgstr ""
#: ../rules/base.xml.in.h:316
-msgid "German (Mac)"
+msgid "Georgian"
msgstr ""
#: ../rules/base.xml.in.h:317
-msgid "German (Mac, eliminate dead keys)"
+msgid "Georgian (France, AZERTY Tskapo)"
msgstr ""
#: ../rules/base.xml.in.h:318
-msgid "German (Neo 2)"
+msgid "Georgian (Italy)"
msgstr ""
#: ../rules/base.xml.in.h:319
-msgid "German (Romanian keyboard with German letters)"
+msgid "Georgian (MESS)"
msgstr ""
#: ../rules/base.xml.in.h:320
-msgid "German (Romanian keyboard with German letters, eliminate dead keys)"
+msgid "Georgian (ergonomic)"
msgstr ""
#: ../rules/base.xml.in.h:321
-msgid "German (Sun dead keys)"
+msgid "German"
msgstr ""
#: ../rules/base.xml.in.h:322
-msgid "German (Switzerland, Mac)"
+msgid "German (Austria)"
msgstr ""
#: ../rules/base.xml.in.h:323
-msgid "German (Switzerland, Sun dead keys)"
+msgid "German (Austria, Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:324
-msgid "German (Switzerland, eliminate dead keys)"
+msgid "German (Austria, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:325
-msgid "German (dead acute)"
+msgid "German (Austria, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:326
-msgid "German (dead grave acute)"
+msgid "German (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:327
-msgid "German (eliminate dead keys)"
+msgid "German (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:328
-msgid "German (lower Sorbian qwertz)"
+msgid "German (Macintosh, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:329
-msgid "German (lower Sorbian)"
+msgid "German (Neo 2)"
msgstr ""
#: ../rules/base.xml.in.h:330
-msgid "German (qwerty)"
+msgid "German (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:331
-msgid "Greek"
+msgid "German (Switzerland)"
msgstr ""
#: ../rules/base.xml.in.h:332
-msgid "Greek (eliminate dead keys)"
+msgid "German (Switzerland, Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:333
-msgid "Greek (extended)"
+msgid "German (Switzerland, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:334
-msgid "Greek (polytonic)"
+msgid "German (Switzerland, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:335
-msgid "Greek (simple)"
+msgid "German (Switzerland, legacy)"
msgstr ""
#: ../rules/base.xml.in.h:336
-msgid "Gujarati"
+msgid "German (dead acute)"
msgstr ""
#: ../rules/base.xml.in.h:337
-msgid "Gyration"
+msgid "German (dead grave acute)"
msgstr ""
#: ../rules/base.xml.in.h:338
-msgid "HTC Dream"
+msgid "German (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:339
-msgid "Happy Hacking Keyboard"
+msgid "German (qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:340
-msgid "Happy Hacking Keyboard for Mac"
+msgid "Greek"
msgstr ""
#: ../rules/base.xml.in.h:341
-msgid "Hausa"
+msgid "Greek (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:342
-msgid "Hebrew"
+msgid "Greek (extended)"
msgstr ""
#: ../rules/base.xml.in.h:343
-msgid "Hebrew (Phonetic)"
+msgid "Greek (polytonic)"
msgstr ""
#: ../rules/base.xml.in.h:344
-msgid "Hebrew (Tiro)"
+msgid "Greek (simple)"
msgstr ""
#: ../rules/base.xml.in.h:345
-msgid "Hebrew (lyx)"
+msgid "Gujarati"
msgstr ""
#: ../rules/base.xml.in.h:346
-msgid "Hewlett-Packard Internet Keyboard"
+msgid "Gyration"
msgstr ""
#: ../rules/base.xml.in.h:347
-msgid "Hewlett-Packard Mini 110 Notebook"
+msgid "HTC Dream"
msgstr ""
#: ../rules/base.xml.in.h:348
-msgid "Hewlett-Packard Omnibook 500 FA"
+msgid "Happy Hacking Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:349
-msgid "Hewlett-Packard Omnibook 5xx"
+msgid "Happy Hacking Keyboard for Mac"
msgstr ""
#: ../rules/base.xml.in.h:350
-msgid "Hewlett-Packard Omnibook 6000/6100"
+msgid "Hausa"
msgstr ""
#: ../rules/base.xml.in.h:351
-msgid "Hewlett-Packard Omnibook XE3 GC"
+msgid "Hebrew"
msgstr ""
#: ../rules/base.xml.in.h:352
-msgid "Hewlett-Packard Omnibook XE3 GF"
+msgid "Hebrew (Biblical, Tiro)"
msgstr ""
#: ../rules/base.xml.in.h:353
-msgid "Hewlett-Packard Omnibook XT1000"
+msgid "Hebrew (lyx)"
msgstr ""
#: ../rules/base.xml.in.h:354
-msgid "Hewlett-Packard Pavilion ZT11xx"
+msgid "Hebrew (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:355
-msgid "Hewlett-Packard Pavilion dv5"
+msgid "Hewlett-Packard Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:356
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgid "Hewlett-Packard Mini 110 Notebook"
msgstr ""
#: ../rules/base.xml.in.h:357
-msgid "Hewlett-Packard nx9020"
+msgid "Hewlett-Packard Omnibook 500 FA"
msgstr ""
#: ../rules/base.xml.in.h:358
-msgid "Hexadecimal"
+msgid "Hewlett-Packard Omnibook 5xx"
msgstr ""
#: ../rules/base.xml.in.h:359
-msgid "Hindi (Bolnagri)"
+msgid "Hewlett-Packard Omnibook 6000/6100"
msgstr ""
#: ../rules/base.xml.in.h:360
-msgid "Hindi (Wx)"
+msgid "Hewlett-Packard Omnibook XE3 GC"
msgstr ""
#: ../rules/base.xml.in.h:361
-msgid "Honeywell Euroboard"
+msgid "Hewlett-Packard Omnibook XE3 GF"
msgstr ""
#: ../rules/base.xml.in.h:362
-msgid "Htc Dream phone"
+msgid "Hewlett-Packard Omnibook XT1000"
msgstr ""
#: ../rules/base.xml.in.h:363
-msgid "Hungarian"
+msgid "Hewlett-Packard Pavilion ZT11xx"
msgstr ""
#: ../rules/base.xml.in.h:364
-msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgid "Hewlett-Packard Pavilion dv5"
msgstr ""
#: ../rules/base.xml.in.h:365
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:366
-msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgid "Hewlett-Packard nx9020"
msgstr ""
#: ../rules/base.xml.in.h:367
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgid "Hexadecimal"
msgstr ""
#: ../rules/base.xml.in.h:368
-msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgid "Hindi (Bolnagri)"
msgstr ""
#: ../rules/base.xml.in.h:369
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgid "Hindi (Wx)"
msgstr ""
#: ../rules/base.xml.in.h:370
-msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgid "Honeywell Euroboard"
msgstr ""
#: ../rules/base.xml.in.h:371
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgid "Htc Dream phone"
msgstr ""
#: ../rules/base.xml.in.h:372
-msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgid "Hungarian"
msgstr ""
#: ../rules/base.xml.in.h:373
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:374
-msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:375
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:376
-msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:377
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:378
-msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:379
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:380
-msgid "Hungarian (eliminate dead keys)"
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:381
-msgid "Hungarian (qwerty)"
+msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:382
-msgid "Hungarian (standard)"
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:383
-msgid "Hyper is mapped to Win-keys"
+msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:384
-msgid "IBM Rapid Access"
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:385
-msgid "IBM Rapid Access II"
+msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:386
-msgid "IBM Space Saver"
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:387
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:388
-msgid "IBM ThinkPad R60/T60/R61/T61"
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:389
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgid "Hungarian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:390
-msgid "Icelandic"
+msgid "Hungarian (qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:391
-msgid "Icelandic (Dvorak)"
+msgid "Hungarian (standard)"
msgstr ""
#: ../rules/base.xml.in.h:392
-msgid "Icelandic (Mac)"
+msgid "Hyper is mapped to Win-keys"
msgstr ""
#: ../rules/base.xml.in.h:393
-msgid "Icelandic (Sun dead keys)"
+msgid "IBM Rapid Access"
msgstr ""
#: ../rules/base.xml.in.h:394
-msgid "Icelandic (eliminate dead keys)"
+msgid "IBM Rapid Access II"
msgstr ""
#: ../rules/base.xml.in.h:395
-msgid "Igbo"
+msgid "IBM Space Saver"
msgstr ""
#: ../rules/base.xml.in.h:396
-msgid "Indian"
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
msgstr ""
#: ../rules/base.xml.in.h:397
-msgid "Inuktitut"
+msgid "IBM ThinkPad R60/T60/R61/T61"
msgstr ""
#: ../rules/base.xml.in.h:398
-msgid "Iraqi"
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
msgstr ""
#: ../rules/base.xml.in.h:399
-msgid "Irish"
+msgid "Icelandic"
msgstr ""
#: ../rules/base.xml.in.h:400
-msgid "Irish (CloGaelach)"
+msgid "Icelandic (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:401
-msgid "Irish (Ogham IS434)"
+msgid "Icelandic (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:402
-msgid "Irish (Ogham)"
+msgid "Icelandic (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:403
-msgid "Irish (UnicodeExpert)"
+msgid "Icelandic (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:404
-msgid "Italian"
+msgid "Igbo"
msgstr ""
#: ../rules/base.xml.in.h:405
-msgid "Italian (Georgian)"
+msgid "Indian"
msgstr ""
#: ../rules/base.xml.in.h:406
-msgid "Italian (Mac)"
+msgid "Inuktitut"
msgstr ""
#: ../rules/base.xml.in.h:407
-msgid "Italian (US keyboard with Italian letters)"
+msgid "Iraqi"
msgstr ""
#: ../rules/base.xml.in.h:408
-msgid "Italian (eliminate dead keys)"
+msgid "Irish"
msgstr ""
#: ../rules/base.xml.in.h:409
-msgid "Japanese"
+msgid "Irish (UnicodeExpert)"
msgstr ""
#: ../rules/base.xml.in.h:410
-msgid "Japanese (Kana 86)"
+msgid "Italian"
msgstr ""
#: ../rules/base.xml.in.h:411
-msgid "Japanese (Kana)"
+msgid "Italian (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:412
-msgid "Japanese (Mac)"
+msgid "Italian (US keyboard with Italian letters)"
msgstr ""
#: ../rules/base.xml.in.h:413
-msgid "Japanese (OADG 109A)"
+msgid "Italian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:414
-msgid "Japanese (PC-98xx Series)"
+msgid "Japanese"
msgstr ""
#: ../rules/base.xml.in.h:415
-msgid "Japanese keyboard options"
+msgid "Japanese (Kana 86)"
msgstr ""
#: ../rules/base.xml.in.h:416
-msgid "Kana Lock key is locking"
+msgid "Japanese (Kana)"
msgstr ""
#: ../rules/base.xml.in.h:417
-msgid "Kannada"
+msgid "Japanese (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:418
-msgid "Kazakh"
+msgid "Japanese (OADG 109A)"
msgstr ""
#: ../rules/base.xml.in.h:419
-msgid "Kazakh (with Russian)"
+msgid "Japanese (PC-98xx Series)"
msgstr ""
#: ../rules/base.xml.in.h:420
-msgid "Key sequence to kill the X server"
+msgid "Japanese keyboard options"
msgstr ""
#: ../rules/base.xml.in.h:421
-msgid "Key to choose 3rd level"
+msgid "Kalmyk"
msgstr ""
#: ../rules/base.xml.in.h:422
-msgid "Key to choose 5th level"
+msgid "Kana Lock key is locking"
msgstr ""
#: ../rules/base.xml.in.h:423
-msgid "Key(s) to change layout"
+msgid "Kannada"
msgstr ""
#: ../rules/base.xml.in.h:424
-msgid "Keytronic FlexPro"
+msgid "Kashubian"
msgstr ""
#: ../rules/base.xml.in.h:425
-msgid "Khmer (Cambodian)"
+msgid "Kazakh"
msgstr ""
#: ../rules/base.xml.in.h:426
-msgid "Kikuyu"
+msgid "Kazakh (with Russian)"
msgstr ""
#: ../rules/base.xml.in.h:427
-msgid "Kinesis"
+msgid "Key sequence to kill the X server"
msgstr ""
#: ../rules/base.xml.in.h:428
-msgid "Korean"
+msgid "Key to choose 3rd level"
msgstr ""
#: ../rules/base.xml.in.h:429
-msgid "Korean (101/104 key compatible)"
+msgid "Key to choose 5th level"
msgstr ""
#: ../rules/base.xml.in.h:430
-msgid "Kurdish (Iran, Arabic-Latin)"
+msgid "Key(s) to change layout"
msgstr ""
#: ../rules/base.xml.in.h:431
-msgid "Kurdish (Iran, F)"
+msgid "Keytronic FlexPro"
msgstr ""
#: ../rules/base.xml.in.h:432
-msgid "Kurdish (Iran, Latin Q)"
+msgid "Khmer (Cambodia)"
msgstr ""
#: ../rules/base.xml.in.h:433
-msgid "Kurdish (Iran, latin alt-Q)"
+msgid "Kikuyu"
msgstr ""
#: ../rules/base.xml.in.h:434
-msgid "Kurdish (Iraq, Arabic-Latin)"
+msgid "Kinesis"
msgstr ""
#: ../rules/base.xml.in.h:435
-msgid "Kurdish (Iraq, F)"
+msgid "Komi"
msgstr ""
#: ../rules/base.xml.in.h:436
-msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgid "Korean"
msgstr ""
#: ../rules/base.xml.in.h:437
-msgid "Kurdish (Iraq, Latin Q)"
+msgid "Korean (101/104 key compatible)"
msgstr ""
#: ../rules/base.xml.in.h:438
-msgid "Kurdish (Syria, F)"
+msgid "Kurdish (Iran, Arabic-Latin)"
msgstr ""
#: ../rules/base.xml.in.h:439
-msgid "Kurdish (Syria, Latin Alt-Q)"
+msgid "Kurdish (Iran, F)"
msgstr ""
#: ../rules/base.xml.in.h:440
-msgid "Kurdish (Syria, Latin Q)"
+msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Turkey, F)"
+msgid "Kurdish (Iran, Latin Q)"
msgstr ""
#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr ""
#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Turkey, Latin Q)"
+msgid "Kurdish (Iraq, F)"
msgstr ""
#: ../rules/base.xml.in.h:444
-msgid "Kutenai"
+msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:445
-msgid "Kyrgyz"
+msgid "Kurdish (Iraq, Latin Q)"
msgstr ""
#: ../rules/base.xml.in.h:446
-msgid "Kyrgyz (phonetic)"
+msgid "Kurdish (Syria, F)"
msgstr ""
#: ../rules/base.xml.in.h:447
-msgid "Lao"
+msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:448
-msgid "Lao (STEA proposed standard layout)"
+msgid "Kurdish (Syria, Latin Q)"
msgstr ""
#: ../rules/base.xml.in.h:449
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgid "Kurdish (Turkey, F)"
msgstr ""
#: ../rules/base.xml.in.h:450
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:451
-msgid "Laptop/notebook eMachines m68xx"
+msgid "Kurdish (Turkey, Latin Q)"
msgstr ""
#: ../rules/base.xml.in.h:452
-msgid "Latvian"
+msgid "Kyrgyz"
msgstr ""
#: ../rules/base.xml.in.h:453
-msgid "Latvian (Apostrophe ' variant)"
+msgid "Kyrgyz (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:454
-msgid "Latvian (F variant)"
+msgid "Lao"
msgstr ""
#: ../rules/base.xml.in.h:455
-msgid "Latvian (Tilde ~ variant)"
+msgid "Lao (STEA proposed standard layout)"
msgstr ""
#: ../rules/base.xml.in.h:456
-msgid "Left Alt"
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:457
-msgid "Left Alt (while pressed)"
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:458
-msgid "Left Alt is swapped with Left Win"
+msgid "Laptop/notebook eMachines m68xx"
msgstr ""
-#: ../rules/base.xml.in.h:459
-msgid "Left Ctrl"
+#: ../rules/base.xml.in.h:459 ../rules/base.extras.xml.in.h:12
+msgid "Latvian"
msgstr ""
#: ../rules/base.xml.in.h:460
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgid "Latvian (F variant)"
msgstr ""
#: ../rules/base.xml.in.h:461
-msgid "Left Ctrl+Left Shift"
+msgid "Latvian (adapted)"
msgstr ""
#: ../rules/base.xml.in.h:462
-msgid "Left Shift"
+msgid "Latvian (apostrophe variant)"
msgstr ""
#: ../rules/base.xml.in.h:463
-msgid "Left Win"
+msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr ""
#: ../rules/base.xml.in.h:464
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgid "Latvian (modern)"
msgstr ""
#: ../rules/base.xml.in.h:465
-msgid "Left Win (while pressed)"
+msgid "Latvian (tilde variant)"
msgstr ""
#: ../rules/base.xml.in.h:466
-msgid ""
-"Left Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
+msgid "Left Alt"
msgstr ""
#: ../rules/base.xml.in.h:467
-msgid ""
-"Left Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
+msgid "Left Alt (while pressed)"
msgstr ""
#: ../rules/base.xml.in.h:468
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgid "Left Alt is swapped with Left Win"
msgstr ""
#: ../rules/base.xml.in.h:469
-msgid "Legacy"
+msgid "Left Ctrl"
msgstr ""
#: ../rules/base.xml.in.h:470
-msgid "Legacy Wang 724"
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr ""
+
+#: ../rules/base.xml.in.h:471
+msgid "Left Ctrl+Left Shift"
msgstr ""
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
#: ../rules/base.xml.in.h:472
-msgid "Legacy key with comma"
+msgid "Left Shift"
msgstr ""
#: ../rules/base.xml.in.h:473
-msgid "Legacy key with dot"
+msgid "Left Win"
msgstr ""
#: ../rules/base.xml.in.h:474
-msgid "Lithuanian"
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr ""
#: ../rules/base.xml.in.h:475
-msgid "Lithuanian (IBM LST 1205-92)"
+msgid "Left Win (while pressed)"
msgstr ""
#: ../rules/base.xml.in.h:476
-msgid "Lithuanian (LEKP)"
+msgid ""
+"Left Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
msgstr ""
#: ../rules/base.xml.in.h:477
-msgid "Lithuanian (LEKPa)"
+msgid ""
+"Left Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
msgstr ""
#: ../rules/base.xml.in.h:478
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr ""
#: ../rules/base.xml.in.h:479
-msgid "Lithuanian (standard)"
+msgid "Legacy"
msgstr ""
#: ../rules/base.xml.in.h:480
-msgid "Logitech Access Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:481
-msgid "Logitech Cordless Desktop"
+msgid "Legacy Wang 724"
msgstr ""
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
#: ../rules/base.xml.in.h:482
-msgid "Logitech Cordless Desktop (alternate option)"
+msgid "Legacy key with comma"
msgstr ""
#: ../rules/base.xml.in.h:483
-msgid "Logitech Cordless Desktop EX110"
+msgid "Legacy key with dot"
msgstr ""
-#: ../rules/base.xml.in.h:484
-msgid "Logitech Cordless Desktop LX-300"
+#: ../rules/base.xml.in.h:484 ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian"
msgstr ""
#: ../rules/base.xml.in.h:485
-msgid "Logitech Cordless Desktop Navigator"
+msgid "Lithuanian (IBM LST 1205-92)"
msgstr ""
#: ../rules/base.xml.in.h:486
-msgid "Logitech Cordless Desktop Optical"
+msgid "Lithuanian (LEKP)"
msgstr ""
#: ../rules/base.xml.in.h:487
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgid "Lithuanian (LEKPa)"
msgstr ""
#: ../rules/base.xml.in.h:488
-msgid "Logitech Cordless Desktop iTouch"
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr ""
#: ../rules/base.xml.in.h:489
-msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgid "Lithuanian (standard)"
msgstr ""
#: ../rules/base.xml.in.h:490
-msgid "Logitech G15 extra keys via G15daemon"
+msgid "Logitech Access Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:491
-msgid "Logitech Generic Keyboard"
+msgid "Logitech Cordless Desktop"
msgstr ""
#: ../rules/base.xml.in.h:492
-msgid "Logitech Internet 350 Keyboard"
+msgid "Logitech Cordless Desktop (alternate option)"
msgstr ""
#: ../rules/base.xml.in.h:493
-msgid "Logitech Internet Keyboard"
+msgid "Logitech Cordless Desktop EX110"
msgstr ""
#: ../rules/base.xml.in.h:494
-msgid "Logitech Internet Navigator Keyboard"
+msgid "Logitech Cordless Desktop LX-300"
msgstr ""
#: ../rules/base.xml.in.h:495
-msgid "Logitech Media Elite Keyboard"
+msgid "Logitech Cordless Desktop Navigator"
msgstr ""
#: ../rules/base.xml.in.h:496
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgid "Logitech Cordless Desktop Optical"
msgstr ""
#: ../rules/base.xml.in.h:497
-msgid "Logitech Ultra-X Keyboard"
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
msgstr ""
#: ../rules/base.xml.in.h:498
-msgid "Logitech diNovo Edge Keyboard"
+msgid "Logitech Cordless Desktop iTouch"
msgstr ""
#: ../rules/base.xml.in.h:499
-msgid "Logitech diNovo Keyboard"
+msgid "Logitech Cordless Freedom/Desktop Navigator"
msgstr ""
#: ../rules/base.xml.in.h:500
-msgid "Logitech iTouch"
+msgid "Logitech G15 extra keys via G15daemon"
msgstr ""
#: ../rules/base.xml.in.h:501
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgid "Logitech Generic Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:502
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgid "Logitech Internet 350 Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:503
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgid "Logitech Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:504
-msgid "MacBook/MacBook Pro"
+msgid "Logitech Internet Navigator Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:505
-msgid "MacBook/MacBook Pro (Intl)"
+msgid "Logitech Media Elite Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:506
-msgid "Macedonian"
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:507
-msgid "Macedonian (eliminate dead keys)"
+msgid "Logitech Ultra-X Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:508
-msgid "Macintosh"
+msgid "Logitech diNovo Edge Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:509
-msgid "Macintosh Old"
+msgid "Logitech diNovo Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:510
-msgid "Make Caps Lock an additional Backspace"
+msgid "Logitech iTouch"
msgstr ""
#: ../rules/base.xml.in.h:511
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
msgstr ""
#: ../rules/base.xml.in.h:512
-msgid "Make Caps Lock an additional Ctrl"
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
msgstr ""
#: ../rules/base.xml.in.h:513
-msgid "Make Caps Lock an additional ESC"
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
msgstr ""
#: ../rules/base.xml.in.h:514
-msgid "Make Caps Lock an additional Hyper"
+msgid "Lower Sorbian"
msgstr ""
#: ../rules/base.xml.in.h:515
-msgid "Make Caps Lock an additional Num Lock"
+msgid "Lower Sorbian (qwertz)"
msgstr ""
#: ../rules/base.xml.in.h:516
-msgid "Make Caps Lock an additional Super"
+msgid "MacBook/MacBook Pro"
msgstr ""
#: ../rules/base.xml.in.h:517
-msgid "Malayalam"
+msgid "MacBook/MacBook Pro (Intl)"
msgstr ""
#: ../rules/base.xml.in.h:518
-msgid "Malayalam (Lalitha)"
+msgid "Macedonian"
msgstr ""
#: ../rules/base.xml.in.h:519
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgid "Macedonian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:520
-msgid "Maltese"
+msgid "Macintosh"
msgstr ""
#: ../rules/base.xml.in.h:521
-msgid "Maltese (with US layout)"
+msgid "Macintosh Old"
msgstr ""
#: ../rules/base.xml.in.h:522
-msgid "Memorex MX1998"
+msgid "Make Caps Lock an additional Backspace"
msgstr ""
#: ../rules/base.xml.in.h:523
-msgid "Memorex MX2500 EZ-Access Keyboard"
+msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
msgstr ""
#: ../rules/base.xml.in.h:524
-msgid "Memorex MX2750"
+msgid "Make Caps Lock an additional Ctrl"
msgstr ""
#: ../rules/base.xml.in.h:525
-msgid "Menu"
+msgid "Make Caps Lock an additional ESC"
msgstr ""
#: ../rules/base.xml.in.h:526
-msgid "Meta is mapped to Left Win"
+msgid "Make Caps Lock an additional Hyper"
msgstr ""
#: ../rules/base.xml.in.h:527
-msgid "Meta is mapped to Win keys"
+msgid "Make Caps Lock an additional Num Lock"
msgstr ""
#: ../rules/base.xml.in.h:528
-msgid "Meta on Left Ctrl"
+msgid "Make Caps Lock an additional Super"
msgstr ""
#: ../rules/base.xml.in.h:529
-msgid "Microsoft Comfort Curve Keyboard 2000"
+msgid "Malayalam"
msgstr ""
#: ../rules/base.xml.in.h:530
-msgid "Microsoft Internet Keyboard"
+msgid "Malayalam (Lalitha)"
msgstr ""
#: ../rules/base.xml.in.h:531
-msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
msgstr ""
#: ../rules/base.xml.in.h:532
-msgid "Microsoft Natural"
+msgid "Maltese"
msgstr ""
#: ../rules/base.xml.in.h:533
-msgid "Microsoft Natural Keyboard Elite"
+msgid "Maltese (with US layout)"
msgstr ""
#: ../rules/base.xml.in.h:534
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgid "Maori"
msgstr ""
#: ../rules/base.xml.in.h:535
-msgid "Microsoft Natural Keyboard Pro OEM"
+msgid "Mari"
msgstr ""
#: ../rules/base.xml.in.h:536
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgid "Memorex MX1998"
msgstr ""
#: ../rules/base.xml.in.h:537
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgid "Memorex MX2500 EZ-Access Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:538
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgid "Memorex MX2750"
msgstr ""
#: ../rules/base.xml.in.h:539
-msgid "Microsoft Office Keyboard"
+msgid "Menu"
msgstr ""
#: ../rules/base.xml.in.h:540
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgid "Meta is mapped to Left Win"
msgstr ""
#: ../rules/base.xml.in.h:541
-msgid "Miscellaneous compatibility options"
+msgid "Meta is mapped to Win keys"
msgstr ""
#: ../rules/base.xml.in.h:542
-msgid "Mongolian"
+msgid "Meta on Left Ctrl"
msgstr ""
#: ../rules/base.xml.in.h:543
-msgid "Montenegrin"
+msgid "Microsoft Comfort Curve Keyboard 2000"
msgstr ""
#: ../rules/base.xml.in.h:544
-msgid "Montenegrin (Cyrillic with guillemets)"
+msgid "Microsoft Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:545
-msgid "Montenegrin (Cyrillic)"
+msgid "Microsoft Internet Keyboard Pro, Swedish"
msgstr ""
#: ../rules/base.xml.in.h:546
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgid "Microsoft Natural"
msgstr ""
#: ../rules/base.xml.in.h:547
-msgid "Montenegrin (Latin qwerty)"
+msgid "Microsoft Natural Keyboard Elite"
msgstr ""
#: ../rules/base.xml.in.h:548
-msgid "Montenegrin (Latin unicode qwerty)"
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
msgstr ""
#: ../rules/base.xml.in.h:549
-msgid "Montenegrin (Latin unicode)"
+msgid "Microsoft Natural Keyboard Pro OEM"
msgstr ""
#: ../rules/base.xml.in.h:550
-msgid "Montenegrin (Latin with guillemets)"
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
msgstr ""
#: ../rules/base.xml.in.h:551
-msgid "Māori"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
msgstr ""
#: ../rules/base.xml.in.h:552
-msgid "NICOLA-F style Backspace"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
msgstr ""
#: ../rules/base.xml.in.h:553
-msgid "Nepali"
+msgid "Microsoft Office Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:554
-msgid "Non-breakable space character at fourth level"
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
msgstr ""
#: ../rules/base.xml.in.h:555
-msgid ""
-"Non-breakable space character at fourth level, thin non-breakable space "
-"character at sixth level"
+msgid "Miscellaneous compatibility options"
msgstr ""
#: ../rules/base.xml.in.h:556
-msgid ""
-"Non-breakable space character at fourth level, thin non-breakable space "
-"character at sixth level (via Ctrl+Shift)"
+msgid "Mongolian"
msgstr ""
#: ../rules/base.xml.in.h:557
-msgid "Non-breakable space character at second level"
+msgid "Montenegrin"
msgstr ""
#: ../rules/base.xml.in.h:558
-msgid "Non-breakable space character at third level"
+msgid "Montenegrin (Cyrillic with guillemets)"
msgstr ""
#: ../rules/base.xml.in.h:559
-msgid "Non-breakable space character at third level, nothing at fourth level"
+msgid "Montenegrin (Cyrillic)"
msgstr ""
#: ../rules/base.xml.in.h:560
-msgid ""
-"Non-breakable space character at third level, thin non-breakable space "
-"character at fourth level"
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr ""
#: ../rules/base.xml.in.h:561
-msgid "Northgate OmniKey 101"
+msgid "Montenegrin (Latin Unicode qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:562
-msgid "Norwegian"
+msgid "Montenegrin (Latin Unicode)"
msgstr ""
#: ../rules/base.xml.in.h:563
-msgid "Norwegian (Dvorak)"
+msgid "Montenegrin (Latin qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:564
-msgid "Norwegian (Mac)"
+msgid "Montenegrin (Latin with guillemets)"
msgstr ""
#: ../rules/base.xml.in.h:565
-msgid "Norwegian (Mac, eliminate dead keys)"
+msgid "NICOLA-F style Backspace"
msgstr ""
#: ../rules/base.xml.in.h:566
-msgid "Norwegian (Northern Saami"
+msgid "Nepali"
msgstr ""
#: ../rules/base.xml.in.h:567
-msgid "Norwegian (eliminate dead keys)"
+msgid "Non-breakable space character at fourth level"
msgstr ""
#: ../rules/base.xml.in.h:568
-msgid "Norwegian (northern Saami, eliminate dead keys)"
+msgid ""
+"Non-breakable space character at fourth level, thin non-breakable space "
+"character at sixth level"
msgstr ""
#: ../rules/base.xml.in.h:569
-msgid "Num Lock"
+msgid ""
+"Non-breakable space character at fourth level, thin non-breakable space "
+"character at sixth level (via Ctrl+Shift)"
msgstr ""
#: ../rules/base.xml.in.h:570
-msgid "Numeric keypad delete key behaviour"
+msgid "Non-breakable space character at second level"
msgstr ""
#: ../rules/base.xml.in.h:571
-msgid "Numeric keypad keys work as with Mac"
+msgid "Non-breakable space character at third level"
msgstr ""
#: ../rules/base.xml.in.h:572
-msgid "Numeric keypad layout selection"
+msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr ""
#: ../rules/base.xml.in.h:573
-msgid "OLPC"
+msgid ""
+"Non-breakable space character at third level, thin non-breakable space "
+"character at fourth level"
msgstr ""
#: ../rules/base.xml.in.h:574
-msgid "Oriya"
+msgid "Northern Saami (Finland)"
msgstr ""
#: ../rules/base.xml.in.h:575
-msgid "Ortek MCK-800 MM/Internet keyboard"
+msgid "Northern Saami (Norway)"
msgstr ""
#: ../rules/base.xml.in.h:576
-msgid "PC-98xx Series"
+msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:577
-msgid "Pashto"
+msgid "Northern Saami (Sweden)"
msgstr ""
#: ../rules/base.xml.in.h:578
-msgid "Pashto (Afghanistan, OLPC)"
+msgid "Northgate OmniKey 101"
msgstr ""
#: ../rules/base.xml.in.h:579
-msgid "Pause"
+msgid "Norwegian"
msgstr ""
#: ../rules/base.xml.in.h:580
-msgid "Persian"
+msgid "Norwegian (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:581
-msgid "Persian (Afghanistan, Dari OLPC)"
+msgid "Norwegian (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:582
-msgid "Persian (with Persian Keypad)"
+msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:583
-msgid "Philippines - Dvorak (Baybayin)"
+msgid "Norwegian (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:584
-msgid "Polish"
+msgid "Num Lock"
msgstr ""
#: ../rules/base.xml.in.h:585
-msgid "Polish (Dvorak)"
+msgid "Numeric keypad delete key behaviour"
msgstr ""
#: ../rules/base.xml.in.h:586
-msgid "Polish (Dvorak, polish quotes on key 1)"
+msgid "Numeric keypad keys work as with Macintosh"
msgstr ""
#: ../rules/base.xml.in.h:587
-msgid "Polish (Dvorak, polish quotes on quotemark key)"
+msgid "Numeric keypad layout selection"
msgstr ""
#: ../rules/base.xml.in.h:588
-msgid "Polish (Kashubian)"
+msgid "OLPC"
msgstr ""
#: ../rules/base.xml.in.h:589
-msgid "Polish (programmer Dvorak)"
+msgid "Occitan"
msgstr ""
#: ../rules/base.xml.in.h:590
-msgid "Polish (qwertz)"
+msgid "Ogham"
msgstr ""
#: ../rules/base.xml.in.h:591
-msgid "Portuguese"
+msgid "Ogham (IS434)"
msgstr ""
#: ../rules/base.xml.in.h:592
-msgid "Portuguese (Brazil)"
+msgid "Oriya"
msgstr ""
#: ../rules/base.xml.in.h:593
-msgid "Portuguese (Brazil, Dvorak)"
+msgid "Ortek MCK-800 MM/Internet keyboard"
msgstr ""
#: ../rules/base.xml.in.h:594
-msgid "Portuguese (Brazil, eliminate dead keys)"
+msgid "Ossetian (Georgia)"
msgstr ""
#: ../rules/base.xml.in.h:595
-msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgid "Ossetian (WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:596
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
+msgid "Ossetian (legacy)"
msgstr ""
#: ../rules/base.xml.in.h:597
-msgid "Portuguese (Brazil, nativo)"
+msgid "PC-98xx Series"
msgstr ""
#: ../rules/base.xml.in.h:598
-msgid "Portuguese (Mac)"
+msgid "Pannonian Rusyn (homophonic)"
msgstr ""
#: ../rules/base.xml.in.h:599
-msgid "Portuguese (Mac, Sun dead keys)"
+msgid "Pashto"
msgstr ""
#: ../rules/base.xml.in.h:600
-msgid "Portuguese (Mac, eliminate dead keys)"
+msgid "Pashto (Afghanistan, OLPC)"
msgstr ""
#: ../rules/base.xml.in.h:601
-msgid "Portuguese (Nativo for Esperanto)"
+msgid "Pause"
msgstr ""
-#: ../rules/base.xml.in.h:602
-msgid "Portuguese (Nativo for USA keyboards)"
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Persian"
msgstr ""
#: ../rules/base.xml.in.h:603
-msgid "Portuguese (Nativo)"
+msgid "Persian (Afghanistan, Dari OLPC)"
msgstr ""
#: ../rules/base.xml.in.h:604
-msgid "Portuguese (Sun dead keys)"
+msgid "Persian (with Persian Keypad)"
msgstr ""
-#: ../rules/base.xml.in.h:605
-msgid "Portuguese (eliminate dead keys)"
+#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:24
+msgid "Polish"
msgstr ""
#: ../rules/base.xml.in.h:606
-msgid "Propeller Voyager (KTEZ-1000)"
+msgid "Polish (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:607
-msgid "PrtSc"
+msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr ""
#: ../rules/base.xml.in.h:608
-msgid "Punjabi (Gurmukhi Jhelum)"
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr ""
#: ../rules/base.xml.in.h:609
-msgid "Punjabi (Gurmukhi)"
+msgid "Polish (programmer Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:610
-msgid "QTronix Scorpius 98N+"
+msgid "Polish (qwertz)"
msgstr ""
#: ../rules/base.xml.in.h:611
-msgid "Right Alt"
+msgid "Portuguese"
msgstr ""
#: ../rules/base.xml.in.h:612
-msgid "Right Alt (while pressed)"
+msgid "Portuguese (Brazil)"
msgstr ""
#: ../rules/base.xml.in.h:613
-msgid ""
-"Right Alt chooses 5th level and activates level5-Lock when pressed together "
-"with another 5th-level-chooser, one press releases the lock"
+msgid "Portuguese (Brazil, Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:614
-msgid ""
-"Right Alt chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
+msgid "Portuguese (Brazil, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:615
-msgid ""
-"Right Alt chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
+msgid "Portuguese (Brazil, nativo for Esperanto)"
msgstr ""
#: ../rules/base.xml.in.h:616
-msgid "Right Alt key never chooses 3rd level"
+msgid "Portuguese (Brazil, nativo for USA keyboards)"
msgstr ""
#: ../rules/base.xml.in.h:617
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
+msgid "Portuguese (Brazil, nativo)"
msgstr ""
#: ../rules/base.xml.in.h:618
-msgid "Right Ctrl"
+msgid "Portuguese (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:619
-msgid "Right Ctrl (while pressed)"
+msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:620
-msgid "Right Ctrl as Right Alt"
+msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:621
-msgid "Right Ctrl is mapped to Menu"
+msgid "Portuguese (Nativo for USA keyboards)"
msgstr ""
#: ../rules/base.xml.in.h:622
-msgid "Right Ctrl+Right Shift"
+msgid "Portuguese (Nativo)"
msgstr ""
#: ../rules/base.xml.in.h:623
-msgid "Right Shift"
+msgid "Portuguese (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:624
-msgid "Right Win"
+msgid "Portuguese (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:625
-msgid "Right Win (while pressed)"
+msgid "Propeller Voyager (KTEZ-1000)"
msgstr ""
#: ../rules/base.xml.in.h:626
-msgid ""
-"Right Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser"
+msgid "PrtSc"
msgstr ""
#: ../rules/base.xml.in.h:627
-msgid ""
-"Right Win chooses 5th level, locks when pressed together with another 5th-"
-"level-chooser, one press releases the lock"
+msgid "Punjabi (Gurmukhi Jhelum)"
msgstr ""
#: ../rules/base.xml.in.h:628
-msgid "Romanian"
+msgid "Punjabi (Gurmukhi)"
msgstr ""
#: ../rules/base.xml.in.h:629
-msgid "Romanian (Crimean Tatar Dobruca-1 Q)"
+msgid "QTronix Scorpius 98N+"
msgstr ""
#: ../rules/base.xml.in.h:630
-msgid "Romanian (Crimean Tatar Dobruca-2 Q)"
+msgid "Right Alt"
msgstr ""
#: ../rules/base.xml.in.h:631
-msgid "Romanian (Crimean Tatar Turkish Alt-Q)"
+msgid "Right Alt (while pressed)"
msgstr ""
#: ../rules/base.xml.in.h:632
-msgid "Romanian (Crimean Tatar Turkish F)"
+msgid ""
+"Right Alt chooses 5th level and activates level5-Lock when pressed together "
+"with another 5th-level-chooser, one press releases the lock"
msgstr ""
#: ../rules/base.xml.in.h:633
-msgid "Romanian (WinKeys)"
+msgid ""
+"Right Alt chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
msgstr ""
#: ../rules/base.xml.in.h:634
-msgid "Romanian (cedilla)"
+msgid ""
+"Right Alt chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
msgstr ""
#: ../rules/base.xml.in.h:635
-msgid "Romanian (standard cedilla)"
+msgid "Right Alt key never chooses 3rd level"
msgstr ""
#: ../rules/base.xml.in.h:636
-msgid "Romanian (standard)"
+msgid "Right Alt, Shift+Right Alt key is Multi_Key"
msgstr ""
#: ../rules/base.xml.in.h:637
-msgid "Rupee on 4"
+msgid "Right Ctrl"
msgstr ""
#: ../rules/base.xml.in.h:638
-msgid "Russian"
+msgid "Right Ctrl (while pressed)"
msgstr ""
#: ../rules/base.xml.in.h:639
-msgid "Russian (Bashkirian)"
+msgid "Right Ctrl as Right Alt"
msgstr ""
#: ../rules/base.xml.in.h:640
-msgid "Russian (Chuvash Latin)"
+msgid "Right Ctrl is mapped to Menu"
msgstr ""
#: ../rules/base.xml.in.h:641
-msgid "Russian (Chuvash)"
+msgid "Right Ctrl+Right Shift"
msgstr ""
#: ../rules/base.xml.in.h:642
-msgid "Russian (DOS)"
+msgid "Right Shift"
msgstr ""
#: ../rules/base.xml.in.h:643
-msgid "Russian (Georgia)"
+msgid "Right Win"
msgstr ""
#: ../rules/base.xml.in.h:644
-msgid "Russian (Germany, phonetic)"
+msgid "Right Win (while pressed)"
msgstr ""
#: ../rules/base.xml.in.h:645
-msgid "Russian (Kalmyk)"
+msgid ""
+"Right Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser"
msgstr ""
#: ../rules/base.xml.in.h:646
-msgid "Russian (Kazakhstan, with Kazakh)"
+msgid ""
+"Right Win chooses 5th level, locks when pressed together with another 5th-"
+"level-chooser, one press releases the lock"
msgstr ""
-#: ../rules/base.xml.in.h:647
-msgid "Russian (Komi)"
+#: ../rules/base.xml.in.h:647 ../rules/base.extras.xml.in.h:26
+msgid "Romanian"
msgstr ""
#: ../rules/base.xml.in.h:648
-msgid "Russian (Mari)"
+msgid "Romanian (Germany)"
msgstr ""
#: ../rules/base.xml.in.h:649
-msgid "Russian (Ossetian, WinKeys)"
+msgid "Romanian (Germany, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:650
-msgid "Russian (Ossetian, legacy)"
+msgid "Romanian (WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:651
-msgid "Russian (Poland, phonetic Dvorak)"
+msgid "Romanian (cedilla)"
msgstr ""
#: ../rules/base.xml.in.h:652
-msgid "Russian (Serbian)"
+msgid "Romanian (standard cedilla)"
msgstr ""
#: ../rules/base.xml.in.h:653
-msgid "Russian (Sweden, phonetic)"
+msgid "Romanian (standard)"
msgstr ""
#: ../rules/base.xml.in.h:654
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgid "Rupee on 4"
msgstr ""
-#: ../rules/base.xml.in.h:655
-msgid "Russian (Tatar)"
+#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:28
+msgid "Russian"
msgstr ""
#: ../rules/base.xml.in.h:656
-msgid "Russian (US, phonetic)"
+msgid "Russian (DOS)"
msgstr ""
#: ../rules/base.xml.in.h:657
-msgid "Russian (Udmurt)"
+msgid "Russian (Georgia)"
msgstr ""
#: ../rules/base.xml.in.h:658
-msgid "Russian (Yakut)"
+msgid "Russian (Germany, phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:659
-msgid "Russian (legacy)"
+msgid "Russian (Kazakhstan, with Kazakh)"
msgstr ""
#: ../rules/base.xml.in.h:660
-msgid "Russian (phonetic WinKeys)"
+msgid "Russian (Poland, phonetic Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:661
-msgid "Russian (phonetic)"
+msgid "Russian (Sweden, phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:662
-msgid "Russian (typewriter)"
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:663
-msgid "Russian (typewriter, legacy)"
+msgid "Russian (US, phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:664
-msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgid "Russian (Ukraine, standard RSTU)"
msgstr ""
#: ../rules/base.xml.in.h:665
-msgid "SK-1300"
+msgid "Russian (legacy)"
msgstr ""
#: ../rules/base.xml.in.h:666
-msgid "SK-2500"
+msgid "Russian (phonetic WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:667
-msgid "SK-6200"
+msgid "Russian (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:668
-msgid "SK-7100"
+msgid "Russian (typewriter)"
msgstr ""
#: ../rules/base.xml.in.h:669
-msgid "SVEN Ergonomic 2500"
+msgid "Russian (typewriter, legacy)"
msgstr ""
#: ../rules/base.xml.in.h:670
-msgid "SVEN Slim 303"
+msgid "SILVERCREST Multimedia Wireless Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:671
-msgid "Saisiyat (Taiwan)"
+msgid "SK-1300"
msgstr ""
#: ../rules/base.xml.in.h:672
-msgid "Samsung SDM 4500P"
+msgid "SK-2500"
msgstr ""
#: ../rules/base.xml.in.h:673
-msgid "Samsung SDM 4510P"
+msgid "SK-6200"
msgstr ""
#: ../rules/base.xml.in.h:674
-msgid "Sanwa Supply SKB-KG3"
+msgid "SK-7100"
msgstr ""
#: ../rules/base.xml.in.h:675
-msgid "Scroll Lock"
+msgid "SVEN Ergonomic 2500"
msgstr ""
#: ../rules/base.xml.in.h:676
-msgid "Secwepemctsin"
+msgid "SVEN Slim 303"
msgstr ""
#: ../rules/base.xml.in.h:677
-msgid "Semi-colon on third level"
+msgid "Saisiyat (Taiwan)"
msgstr ""
#: ../rules/base.xml.in.h:678
-msgid "Serbian"
+msgid "Samsung SDM 4500P"
msgstr ""
#: ../rules/base.xml.in.h:679
-msgid "Serbian (Latin Unicode qwerty)"
+msgid "Samsung SDM 4510P"
msgstr ""
#: ../rules/base.xml.in.h:680
-msgid "Serbian (Latin Unicode)"
+msgid "Sanwa Supply SKB-KG3"
msgstr ""
#: ../rules/base.xml.in.h:681
-msgid "Serbian (Latin qwerty)"
+msgid "Scroll Lock"
msgstr ""
#: ../rules/base.xml.in.h:682
-msgid "Serbian (Latin with guillemets)"
+msgid "Semi-colon on third level"
msgstr ""
-#: ../rules/base.xml.in.h:683
-msgid "Serbian (Latin)"
+#: ../rules/base.xml.in.h:683 ../rules/base.extras.xml.in.h:31
+msgid "Serbian"
msgstr ""
#: ../rules/base.xml.in.h:684
-msgid "Serbian (Pannonian Rusyn Homophonic)"
+msgid "Serbian (Latin Unicode qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:685
-msgid "Serbian (Z and ZHE swapped)"
+msgid "Serbian (Latin Unicode)"
msgstr ""
#: ../rules/base.xml.in.h:686
-msgid "Serbian (with guillemets)"
+msgid "Serbian (Latin qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:687
-msgid "Serbo-Croatian (US)"
+msgid "Serbian (Latin with guillemets)"
msgstr ""
#: ../rules/base.xml.in.h:688
-msgid "Shift cancels Caps Lock"
+msgid "Serbian (Latin)"
msgstr ""
#: ../rules/base.xml.in.h:689
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgid "Serbian (Russia)"
msgstr ""
#: ../rules/base.xml.in.h:690
-msgid "Shift with numeric keypad keys works as in MS Windows"
+msgid "Serbian (Z and ZHE swapped)"
msgstr ""
#: ../rules/base.xml.in.h:691
-msgid "Shift+Caps Lock"
+msgid "Serbian (with guillemets)"
msgstr ""
#: ../rules/base.xml.in.h:692
-msgid "Sindhi"
+msgid "Serbo-Croatian (US)"
msgstr ""
#: ../rules/base.xml.in.h:693
-msgid "Sinhala"
+msgid "Shift cancels Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:694
-msgid "Slovak"
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr ""
#: ../rules/base.xml.in.h:695
-msgid "Slovak (extended Backslash)"
+msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr ""
#: ../rules/base.xml.in.h:696
-msgid "Slovak (qwerty)"
+msgid "Shift+Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:697
-msgid "Slovak (qwerty, extended Backslash)"
+msgid "Sindhi"
msgstr ""
#: ../rules/base.xml.in.h:698
-msgid "Slovene"
+msgid "Sinhala"
msgstr ""
#: ../rules/base.xml.in.h:699
-msgid "Slovene (US keyboard with Slovenian letters)"
+msgid "Slovak"
msgstr ""
#: ../rules/base.xml.in.h:700
-msgid "Slovene (use guillemets for quotes)"
+msgid "Slovak (extended Backslash)"
msgstr ""
#: ../rules/base.xml.in.h:701
-msgid "Spanish"
+msgid "Slovak (qwerty)"
msgstr ""
#: ../rules/base.xml.in.h:702
-msgid "Spanish (Asturian variant with bottom-dot H and bottom-dot L)"
+msgid "Slovak (qwerty, extended Backslash)"
msgstr ""
#: ../rules/base.xml.in.h:703
-msgid "Spanish (Catalan variant with middle-dot L)"
+msgid "Slovenian"
msgstr ""
#: ../rules/base.xml.in.h:704
-msgid "Spanish (Dvorak)"
+msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr ""
#: ../rules/base.xml.in.h:705
-msgid "Spanish (Latin American)"
+msgid "Slovenian (use guillemets for quotes)"
msgstr ""
#: ../rules/base.xml.in.h:706
-msgid "Spanish (Latin American, eliminate dead keys)"
+msgid "Spanish"
msgstr ""
#: ../rules/base.xml.in.h:707
-msgid "Spanish (Latin American, include dead tilde)"
+msgid "Spanish (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:708
-msgid "Spanish (Latin American, sun dead keys)"
+msgid "Spanish (Latin American)"
msgstr ""
#: ../rules/base.xml.in.h:709
-msgid "Spanish (Mac)"
+msgid "Spanish (Latin American, Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:710
-msgid "Spanish (Sun dead keys)"
+msgid "Spanish (Latin American, eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:711
-msgid "Spanish (eliminate dead keys)"
+msgid "Spanish (Latin American, include dead tilde)"
msgstr ""
#: ../rules/base.xml.in.h:712
-msgid "Spanish (include dead tilde)"
+msgid "Spanish (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:713
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgid "Spanish (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:714
-msgid "Sun Type 5/6"
+msgid "Spanish (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:715
-msgid "Super Power Multimedia Keyboard"
+msgid "Spanish (include dead tilde)"
msgstr ""
#: ../rules/base.xml.in.h:716
-msgid "Swahili (Kenya)"
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr ""
#: ../rules/base.xml.in.h:717
-msgid "Swahili (Tanzania)"
+msgid "Sun Type 5/6"
msgstr ""
#: ../rules/base.xml.in.h:718
-msgid "Swap Ctrl and Caps Lock"
+msgid "Super Power Multimedia Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:719
-msgid "Swap ESC and Caps Lock"
+msgid "Swahili (Kenya)"
msgstr ""
#: ../rules/base.xml.in.h:720
-msgid "Swedish"
+msgid "Swahili (Tanzania)"
msgstr ""
#: ../rules/base.xml.in.h:721
-msgid "Swedish (Dvorak)"
+msgid "Swap Ctrl and Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:722
-msgid "Swedish (Mac)"
+msgid "Swap ESC and Caps Lock"
msgstr ""
#: ../rules/base.xml.in.h:723
-msgid "Swedish (Svdvorak)"
+msgid "Swedish"
msgstr ""
#: ../rules/base.xml.in.h:724
-msgid "Swedish (eliminate dead keys)"
+msgid "Swedish (Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:725
-msgid "Swedish (northern Saami)"
+msgid "Swedish (Macintosh)"
msgstr ""
#: ../rules/base.xml.in.h:726
-msgid "Swiss"
+msgid "Swedish (Svdvorak)"
msgstr ""
#: ../rules/base.xml.in.h:727
-msgid "Swiss (legacy)"
+msgid "Swedish (eliminate dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:728
-msgid "Symplon PaceBook (tablet PC)"
+msgid "Swedish Sign Language"
msgstr ""
#: ../rules/base.xml.in.h:729
-msgid "Syriac"
+msgid "Symplon PaceBook (tablet PC)"
msgstr ""
#: ../rules/base.xml.in.h:730
-msgid "Syriac (phonetic)"
+msgid "Syriac"
msgstr ""
#: ../rules/base.xml.in.h:731
-msgid "Taiwanese"
+msgid "Syriac (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:732
-msgid "Taiwanese (indigenous)"
+msgid "Taiwanese"
msgstr ""
#: ../rules/base.xml.in.h:733
-msgid "Tajik"
+msgid "Taiwanese (indigenous)"
msgstr ""
#: ../rules/base.xml.in.h:734
-msgid "Tajik (legacy)"
+msgid "Tajik"
msgstr ""
#: ../rules/base.xml.in.h:735
-msgid "Tamil"
+msgid "Tajik (legacy)"
msgstr ""
#: ../rules/base.xml.in.h:736
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgid "Tamil"
msgstr ""
#: ../rules/base.xml.in.h:737
-msgid "Tamil (Sri Lanka, Unicode)"
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr ""
#: ../rules/base.xml.in.h:738
-msgid "Tamil (TAB typewriter)"
+msgid "Tamil (Sri Lanka, Unicode)"
msgstr ""
#: ../rules/base.xml.in.h:739
-msgid "Tamil (TSCII typewriter)"
+msgid "Tamil (TAB typewriter)"
msgstr ""
#: ../rules/base.xml.in.h:740
-msgid "Tamil (Unicode)"
+msgid "Tamil (TSCII typewriter)"
msgstr ""
#: ../rules/base.xml.in.h:741
-msgid "Tamil (keyboard with numerals)"
+msgid "Tamil (Unicode)"
msgstr ""
#: ../rules/base.xml.in.h:742
-msgid "Targa Visionary 811"
+msgid "Tamil (keyboard with numerals)"
msgstr ""
#: ../rules/base.xml.in.h:743
-msgid "Telugu"
+msgid "Targa Visionary 811"
msgstr ""
#: ../rules/base.xml.in.h:744
-msgid "Thai"
+msgid "Tatar"
msgstr ""
#: ../rules/base.xml.in.h:745
-msgid "Thai (Pattachote)"
+msgid "Telugu"
msgstr ""
#: ../rules/base.xml.in.h:746
-msgid "Thai (TIS-820.2538)"
+msgid "Thai"
msgstr ""
#: ../rules/base.xml.in.h:747
-msgid "To the corresponding key in a Dvorak keyboard."
+msgid "Thai (Pattachote)"
msgstr ""
#: ../rules/base.xml.in.h:748
-msgid "To the corresponding key in a Qwerty keyboard."
+msgid "Thai (TIS-820.2538)"
msgstr ""
#: ../rules/base.xml.in.h:749
-msgid "Toggle PointerKeys with Shift + NumLock."
+msgid "Tibetan"
msgstr ""
#: ../rules/base.xml.in.h:750
-msgid "Toshiba Satellite S3000"
+msgid "Tibetan (with ASCII numerals)"
msgstr ""
#: ../rules/base.xml.in.h:751
-msgid "Trust Direct Access Keyboard"
+msgid "To the corresponding key in a Dvorak keyboard."
msgstr ""
#: ../rules/base.xml.in.h:752
-msgid "Trust Slimline"
+msgid "To the corresponding key in a Qwerty keyboard."
msgstr ""
#: ../rules/base.xml.in.h:753
-msgid "Trust Wireless Keyboard Classic"
+msgid "Toggle PointerKeys with Shift + NumLock."
msgstr ""
#: ../rules/base.xml.in.h:754
-msgid "Tswana"
+msgid "Toshiba Satellite S3000"
msgstr ""
#: ../rules/base.xml.in.h:755
-msgid "Turkish"
+msgid "Trust Direct Access Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:756
-msgid "Turkish (Alt-Q)"
+msgid "Trust Slimline"
msgstr ""
#: ../rules/base.xml.in.h:757
-msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
+msgid "Trust Wireless Keyboard Classic"
msgstr ""
#: ../rules/base.xml.in.h:758
-msgid "Turkish (Crimean Tatar Turkish F)"
+msgid "Tswana"
msgstr ""
#: ../rules/base.xml.in.h:759
-msgid "Turkish (Crimean Tatar Turkish Q)"
+msgid "Turkish"
msgstr ""
#: ../rules/base.xml.in.h:760
-msgid "Turkish (F)"
+msgid "Turkish (Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:761
-msgid "Turkish (Sun dead keys)"
+msgid "Turkish (F)"
msgstr ""
#: ../rules/base.xml.in.h:762
-msgid "Turkish (international with dead keys)"
+msgid "Turkish (Sun dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:763
-msgid "Turkmen"
+msgid "Turkish (international with dead keys)"
msgstr ""
#: ../rules/base.xml.in.h:764
-msgid "Turkmen (Alt-Q)"
+msgid "Turkmen"
msgstr ""
#: ../rules/base.xml.in.h:765
-msgid "TypeMatrix EZ-Reach 2020"
+msgid "Turkmen (Alt-Q)"
msgstr ""
#: ../rules/base.xml.in.h:766
-msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgid "TypeMatrix EZ-Reach 2020"
msgstr ""
#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2030 USB"
+msgid "TypeMatrix EZ-Reach 2030 PS2"
msgstr ""
#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgid "TypeMatrix EZ-Reach 2030 USB"
msgstr ""
#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
msgstr ""
#: ../rules/base.xml.in.h:770
-msgid "Ukrainian"
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
msgstr ""
#: ../rules/base.xml.in.h:771
-msgid "Ukrainian (Crimean Tatar Turkish Alt-Q)"
+msgid "Udmurt"
msgstr ""
#: ../rules/base.xml.in.h:772
-msgid "Ukrainian (Crimean Tatar Turkish F)"
+msgid "Ukrainian"
msgstr ""
#: ../rules/base.xml.in.h:773
-msgid "Ukrainian (Crimean Tatar Turkish Q)"
+msgid "Ukrainian (WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (WinKeys)"
+msgid "Ukrainian (homophonic)"
msgstr ""
#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (homophonic)"
+msgid "Ukrainian (legacy)"
msgstr ""
#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (legacy)"
+msgid "Ukrainian (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (phonetic)"
+msgid "Ukrainian (standard RSTU)"
msgstr ""
#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (standard RSTU on Russian layout)"
+msgid "Ukrainian (typewriter)"
msgstr ""
#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (standard RSTU)"
+msgid "Unicode additions (arrows and math operators)"
msgstr ""
#: ../rules/base.xml.in.h:780
-msgid "Ukrainian (typewriter)"
+msgid ""
+"Unicode additions (arrows and math operators). Math operators on default "
+"level"
msgstr ""
#: ../rules/base.xml.in.h:781
-msgid "Unicode additions (arrows and math operators)"
+msgid "Unitek KB-1925"
msgstr ""
#: ../rules/base.xml.in.h:782
-msgid ""
-"Unicode additions (arrows and math operators). Math operators on default "
-"level"
+msgid "Urdu (Pakistan)"
msgstr ""
#: ../rules/base.xml.in.h:783
-msgid "Unitek KB-1925"
+msgid "Urdu (Pakistan, CRULP)"
msgstr ""
#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan)"
+msgid "Urdu (Pakistan, NLA)"
msgstr ""
#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan, CRULP)"
+msgid "Urdu (WinKeys)"
msgstr ""
#: ../rules/base.xml.in.h:786
-msgid "Urdu (Pakistan, NLA)"
+msgid "Urdu (alternative phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:787
-msgid "Urdu (WinKeys)"
+msgid "Urdu (phonetic)"
msgstr ""
#: ../rules/base.xml.in.h:788
-msgid "Urdu (alternative phonetic)"
+msgid "Use keyboard LED to show alternative layout"
msgstr ""
#: ../rules/base.xml.in.h:789
-msgid "Urdu (phonetic)"
+msgid "Using space key to input non-breakable space character"
msgstr ""
#: ../rules/base.xml.in.h:790
-msgid "Use keyboard LED to show alternative layout"
+msgid "Usual space at any level"
msgstr ""
#: ../rules/base.xml.in.h:791
-msgid "Using space key to input non-breakable space character"
+msgid "Uyghur"
msgstr ""
#: ../rules/base.xml.in.h:792
-msgid "Usual space at any level"
+msgid "Uzbek"
msgstr ""
#: ../rules/base.xml.in.h:793
-msgid "Uzbek"
+msgid "Uzbek (Afghanistan)"
msgstr ""
#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan)"
+msgid "Uzbek (Afghanistan, OLPC)"
msgstr ""
#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Afghanistan, OLPC)"
+msgid "Uzbek (Latin)"
msgstr ""
#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Crimean Tatar Turkish Alt-Q)"
+msgid "Vietnamese"
msgstr ""
#: ../rules/base.xml.in.h:797
-msgid "Uzbek (Crimean Tatar Turkish F)"
+msgid "ViewSonic KU-306 Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:798
-msgid "Uzbek (Crimean Tatar Turkish Q)"
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr ""
#: ../rules/base.xml.in.h:799
-msgid "Uzbek (Latin)"
+msgid ""
+"Wang 724 keypad with Unicode additions (arrows and math operators). Math "
+"operators on default level"
msgstr ""
#: ../rules/base.xml.in.h:800
-msgid "Vietnamese"
+msgid "Winbook Model XP5"
msgstr ""
#: ../rules/base.xml.in.h:801
-msgid "ViewSonic KU-306 Internet Keyboard"
+msgid "Wolof"
msgstr ""
#: ../rules/base.xml.in.h:802
-msgid "Wang 724 keypad with unicode additions (arrows and math operators)"
+msgid "Yahoo! Internet Keyboard"
msgstr ""
#: ../rules/base.xml.in.h:803
-msgid ""
-"Wang 724 keypad with unicode additions (arrows and math operators). Math "
-"operators on default level"
+msgid "Yakut"
msgstr ""
#: ../rules/base.xml.in.h:804
-msgid "Winbook Model XP5"
-msgstr ""
-
-#: ../rules/base.xml.in.h:805
-msgid "Wolof"
-msgstr ""
-
-#: ../rules/base.xml.in.h:806
-msgid "Yahoo! Internet Keyboard"
-msgstr ""
-
-#: ../rules/base.xml.in.h:807
msgid "Yoruba"
msgstr ""
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:805
msgid "Zero-width non-joiner character at second level"
msgstr ""
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:806
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level"
msgstr ""
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:807
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, nothing at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:808
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, thin non-breakable space at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:809
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, zero-width joiner at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:810
msgid ""
"Zero-width non-joiner character at second level, zero-width joiner character "
"at third level"
msgstr ""
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:811
msgid ""
"Zero-width non-joiner character at second level, zero-width joiner character "
"at third level, non-breakable space character at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:812
msgid ""
"Zero-width non-joiner character at third level, zero-width joiner at fourth "
"level"
msgstr ""
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:813
msgid "ak"
msgstr ""
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:814
msgid "am"
msgstr ""
-#: ../rules/base.xml.in.h:818
+#: ../rules/base.xml.in.h:815
msgid "ar"
msgstr ""
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:816
msgid "avn"
msgstr ""
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:817
msgid "az"
msgstr ""
-#: ../rules/base.xml.in.h:821
+#: ../rules/base.xml.in.h:818
msgid "be"
msgstr ""
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:819
msgid "ber"
msgstr ""
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:820
msgid "bg"
msgstr ""
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:821
msgid "bm"
msgstr ""
-#: ../rules/base.xml.in.h:825
+#: ../rules/base.xml.in.h:822
msgid "bn"
msgstr ""
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:823
msgid "brl"
msgstr ""
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:824
msgid "bs"
msgstr ""
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:825
msgid "ca"
msgstr ""
-#: ../rules/base.xml.in.h:829
-msgid "che"
+#: ../rules/base.xml.in.h:826
+msgid "chr"
msgstr ""
-#: ../rules/base.xml.in.h:830
-msgid "chr"
+#: ../rules/base.xml.in.h:827
+msgid "cm"
msgstr ""
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:828
+msgid "crh"
+msgstr ""
+
+#: ../rules/base.xml.in.h:829
msgid "cs"
msgstr ""
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:830
msgid "da"
msgstr ""
-#: ../rules/base.xml.in.h:833
+#: ../rules/base.xml.in.h:831
msgid "de"
msgstr ""
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:832
msgid "dv"
msgstr ""
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:833
msgid "dz"
msgstr ""
-#: ../rules/base.xml.in.h:836
+#: ../rules/base.xml.in.h:834
msgid "ee"
msgstr ""
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:835 ../rules/base.extras.xml.in.h:34
msgid "en"
msgstr ""
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:836
msgid "eo"
msgstr ""
-#: ../rules/base.xml.in.h:839
+#: ../rules/base.xml.in.h:837
msgid "es"
msgstr ""
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:838
msgid "et"
msgstr ""
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:839 ../rules/base.extras.xml.in.h:35
msgid "fa"
msgstr ""
-#: ../rules/base.xml.in.h:842
+#: ../rules/base.xml.in.h:840
msgid "ff"
msgstr ""
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:841
msgid "fi"
msgstr ""
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:842
msgid "fo"
msgstr ""
-#: ../rules/base.xml.in.h:845
+#: ../rules/base.xml.in.h:843 ../rules/base.extras.xml.in.h:36
msgid "fr"
msgstr ""
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:844
msgid "gaa"
msgstr ""
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:845
msgid "gr"
msgstr ""
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:846
msgid "gu"
msgstr ""
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:847
msgid "ha"
msgstr ""
-#: ../rules/base.xml.in.h:850
+#: ../rules/base.xml.in.h:848
msgid "he"
msgstr ""
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:849
msgid "hi"
msgstr ""
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:850
msgid "hr"
msgstr ""
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:851
msgid "hu"
msgstr ""
-#: ../rules/base.xml.in.h:854
+#: ../rules/base.xml.in.h:852 ../rules/base.extras.xml.in.h:37
msgid "hy"
msgstr ""
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:853
msgid "ie"
msgstr ""
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:854
msgid "ig"
msgstr ""
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:855
msgid "ike"
msgstr ""
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:856
msgid "in"
msgstr ""
-#: ../rules/base.xml.in.h:859
-msgid "irq"
-msgstr ""
-
-#: ../rules/base.xml.in.h:860
+#: ../rules/base.xml.in.h:857
msgid "is"
msgstr ""
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:858
msgid "it"
msgstr ""
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:859
msgid "ja"
msgstr ""
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:860
msgid "ka"
msgstr ""
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:861
msgid "ki"
msgstr ""
-#: ../rules/base.xml.in.h:865
+#: ../rules/base.xml.in.h:862
msgid "kk"
msgstr ""
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:863
msgid "km"
msgstr ""
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:864
msgid "kn"
msgstr ""
-#: ../rules/base.xml.in.h:868
+#: ../rules/base.xml.in.h:865
msgid "ko"
msgstr ""
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:866
msgid "ku"
msgstr ""
-#: ../rules/base.xml.in.h:870
-msgid "kut"
-msgstr ""
-
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:867
msgid "lo"
msgstr ""
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:868 ../rules/base.extras.xml.in.h:39
msgid "lt"
msgstr ""
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:40
msgid "lv"
msgstr ""
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:870
msgid "mi"
msgstr ""
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:871
msgid "mk"
msgstr ""
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:872
msgid "ml"
msgstr ""
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:873
msgid "mn"
msgstr ""
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:874
msgid "mt"
msgstr ""
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:875
msgid "my"
msgstr ""
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:876
msgid "ne"
msgstr ""
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:877
msgid "nl"
msgstr ""
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:878
msgid "no"
msgstr ""
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:879
msgid "or"
msgstr ""
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:880
msgid "pa"
msgstr ""
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:881
msgid "ph"
msgstr ""
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:882 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr ""
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:883
msgid "ps"
msgstr ""
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:884
msgid "pt"
msgstr ""
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:42
msgid "ro"
msgstr ""
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:886 ../rules/base.extras.xml.in.h:43
msgid "ru"
msgstr ""
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:887
msgid "sd"
msgstr ""
-#: ../rules/base.xml.in.h:892
-msgid "shs"
-msgstr ""
-
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:888
msgid "si"
msgstr ""
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:889
msgid "sk"
msgstr ""
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:890
msgid "sl"
msgstr ""
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:891
msgid "sq"
msgstr ""
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:892 ../rules/base.extras.xml.in.h:45
msgid "sr"
msgstr ""
-#: ../rules/base.xml.in.h:898
-msgid "srp"
-msgstr ""
-
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:893
msgid "sv"
msgstr ""
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:894
msgid "sw"
msgstr ""
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:895
msgid "syc"
msgstr ""
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:896
msgid "ta"
msgstr ""
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:897
msgid "te"
msgstr ""
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:898
msgid "tg"
msgstr ""
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:899
msgid "th"
msgstr ""
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:900
msgid "tk"
msgstr ""
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:901
msgid "tn"
msgstr ""
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:902
msgid "tr"
msgstr ""
-#: ../rules/base.xml.in.h:909
-msgid "twn"
-msgstr ""
-
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:903
msgid "uk"
msgstr ""
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:904
msgid "ur"
msgstr ""
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:905
msgid "uz"
msgstr ""
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:906
msgid "vi"
msgstr ""
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:907
msgid "wo"
msgstr ""
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:908
msgid "xsy"
msgstr ""
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:909
msgid "yo"
msgstr ""
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:910
msgid "zh"
msgstr ""
#: ../rules/base.extras.xml.in.h:1
-msgid "APL"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:2
-msgid "Iran"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:3
-msgid "Iran - Avestan"
+msgid "APL Keyboard Symbols"
msgstr ""
#: ../rules/base.extras.xml.in.h:4
-msgid "Lithuania"
+msgid "Atsina"
msgstr ""
#: ../rules/base.extras.xml.in.h:5
-msgid "Lithuania - Dvorak"
+msgid "Avestan"
msgstr ""
#: ../rules/base.extras.xml.in.h:6
-msgid "Ltu"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:7
-msgid "Romania"
+msgid "Couer D'alene Salish"
msgstr ""
#: ../rules/base.extras.xml.in.h:8
-msgid "Romania - Ergonomic Touchtype"
+msgid "English (US, international AltGr Unicode combining)"
msgstr ""
#: ../rules/base.extras.xml.in.h:9
-msgid "Rou"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:10
-msgid "Rus"
+msgid "English (US, international AltGr Unicode combining, alternative)"
msgstr ""
#: ../rules/base.extras.xml.in.h:11
-msgid "Russia"
-msgstr ""
-
-#: ../rules/base.extras.xml.in.h:12
-msgid "Serbia"
+msgid "Kutenai"
msgstr ""
#: ../rules/base.extras.xml.in.h:13
-msgid "Serbia - Combining accents instead of dead keys"
+msgid "Latvian (US Colemak)"
msgstr ""
#: ../rules/base.extras.xml.in.h:14
-msgid "Srb"
+msgid "Latvian (US Colemak, apostrophe variant)"
msgstr ""
#: ../rules/base.extras.xml.in.h:15
-msgid "USA"
+msgid "Latvian (US Dvorak)"
msgstr ""
#: ../rules/base.extras.xml.in.h:16
-msgid "USA - Atsina"
+msgid "Latvian (US Dvorak, Y variant)"
msgstr ""
#: ../rules/base.extras.xml.in.h:17
-msgid "USA - Couer D'alene Salish"
+msgid "Latvian (US Dvorak, minus variant)"
msgstr ""
#: ../rules/base.extras.xml.in.h:18
-msgid "USA - International (AltGr Unicode combining)"
+msgid "Latvian (programmer US Dvorak)"
msgstr ""
#: ../rules/base.extras.xml.in.h:19
-msgid "USA - International (AltGr Unicode combining, alternative)"
+msgid "Latvian (programmer US Dvorak, Y variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:20
+msgid "Latvian (programmer US Dvorak, minus variant)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:22
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:25
+msgid "Polish (international with dead keys)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:27
+msgid "Romanian (ergonomic Touchtype)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:29
+msgid "Russian (with UKR and BEL layout)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:30
+msgid "Secwepemctsin"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:33
+msgid "apl"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "kut"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:44
+msgid "shs"
msgstr ""
diff --git a/xorg-server/xkeyboard-config/rules/base.extras.xml.in b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
index 050141434..bbdf8db19 100644
--- a/xorg-server/xkeyboard-config/rules/base.extras.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
@@ -6,7 +6,7 @@
<layout>
<configItem>
<name>apl</name>
- <_shortDescription>APL</_shortDescription>
+ <_shortDescription>apl</_shortDescription>
<_description>APL Keyboard Symbols</_description>
<languageList><iso639Id>eng</iso639Id></languageList>
</configItem>
@@ -39,7 +39,7 @@
<layout>
<configItem>
<name>ir</name>
- <_shortDescription>Iran</_shortDescription>
+ <_shortDescription>fa</_shortDescription>
<_description>Persian</_description>
<languageList><iso639Id>per</iso639Id></languageList>
</configItem>
@@ -56,15 +56,15 @@
<layout>
<configItem>
<name>lt</name>
- <_shortDescription>Ltu</_shortDescription>
+ <_shortDescription>lt</_shortDescription>
<_description>Lithuanian</_description>
<languageList><iso639Id>lit</iso639Id></languageList>
</configItem>
<variantList>
<variant>
<configItem>
- <name>dvorak</name>
- <_description>Lithuanian (Dvorak)</_description>
+ <name>us_dvorak</name>
+ <_description>Lithuanian (US Dvorak with Lithuanian letters)</_description>
</configItem>
</variant>
</variantList>
@@ -184,7 +184,7 @@
<layout>
<configItem>
<name>ro</name>
- <_shortDescription>Rou</_shortDescription>
+ <_shortDescription>ro</_shortDescription>
<_description>Romanian</_description>
<languageList><iso639Id>rum</iso639Id></languageList>
</configItem>
@@ -200,7 +200,7 @@
<layout>
<configItem>
<name>rs</name>
- <_shortDescription>Srb</_shortDescription>
+ <_shortDescription>sr</_shortDescription>
<_description>Serbian</_description>
<languageList><iso639Id>srp</iso639Id></languageList>
</configItem>
@@ -216,7 +216,7 @@
<layout>
<configItem>
<name>ru</name>
- <_shortDescription>Rus</_shortDescription>
+ <_shortDescription>ru</_shortDescription>
<_description>Russian</_description>
</configItem>
<variantList>
@@ -227,6 +227,34 @@
<languageList><iso639Id>chu</iso639Id></languageList>
</configItem>
</variant>
+ <variant>
+ <configItem>
+ <name>ruu</name>
+ <_shortDescription>ru</_shortDescription>
+ <_description>Russian (with UKR and BEL layout)</_description>
+ <languageList><iso639Id>rus</iso639Id>
+ <iso639Id>ukr</iso639Id>
+ <iso639Id>bel</iso639Id></languageList>
+ </configItem>
+ </variant>
+ </variantList>
+ </layout>
+ <layout>
+ <configItem>
+ <name>am</name>
+ <_shortDescription>hy</_shortDescription>
+ <_description>Armenian</_description>
+ <languageList>
+ <iso639Id>hye</iso639Id>
+ </languageList>
+ </configItem>
+ <variantList>
+ <variant>
+ <configItem>
+ <name>olpc-phonetic</name>
+ <_description>Armenian (alternative phonetic for OLPC)</_description>
+ </configItem>
+ </variant>
</variantList>
</layout>
</layoutList>
diff --git a/xorg-server/xkeyboard-config/rules/base.xml.in b/xorg-server/xkeyboard-config/rules/base.xml.in
index 9ddba2e64..33307dd81 100644
--- a/xorg-server/xkeyboard-config/rules/base.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.xml.in
@@ -1384,7 +1384,7 @@
<layout>
<configItem>
<name>af</name>
- <_shortDescription>Afg</_shortDescription>
+ <_shortDescription>fa</_shortDescription>
<_description>Afghani</_description>
</configItem>
<variantList>
@@ -2581,7 +2581,7 @@
<layout>
<configItem>
<name>iq</name>
- <_shortDescription>irq</_shortDescription>
+ <_shortDescription>ar</_shortDescription>
<_description>Iraqi</_description>
<languageList><iso639Id>ara</iso639Id>
<iso639Id>kur</iso639Id></languageList>
@@ -3581,7 +3581,7 @@
<layout>
<configItem>
<name>me</name>
- <_shortDescription>srp</_shortDescription>
+ <_shortDescription>sr</_shortDescription>
<_description>Montenegrin</_description>
<languageList>
<iso639Id>srp</iso639Id>
@@ -4310,7 +4310,7 @@
<layout>
<configItem>
<name>ch</name>
- <_shortDescription>che</_shortDescription>
+ <_shortDescription>de</_shortDescription>
<_description>German (Switzerland)</_description>
<languageList><iso639Id>ger</iso639Id>
<iso639Id>gsw</iso639Id></languageList>
@@ -4613,7 +4613,7 @@
<layout>
<configItem>
<name>tw</name>
- <_shortDescription>twn</_shortDescription>
+ <_shortDescription>zh</_shortDescription>
<_description>Taiwanese</_description>
<languageList>
<iso639Id>trv</iso639Id>
@@ -4708,7 +4708,7 @@
<layout>
<configItem>
<name>gb</name>
- <_shortDescription>GBr</_shortDescription>
+ <_shortDescription>en</_shortDescription>
<_description>English (UK)</_description>
<languageList>
<iso639Id>eng</iso639Id>
diff --git a/xorg-server/xkeyboard-config/symbols/am b/xorg-server/xkeyboard-config/symbols/am
index 29931474f..33711c4a8 100644
--- a/xorg-server/xkeyboard-config/symbols/am
+++ b/xorg-server/xkeyboard-config/symbols/am
@@ -138,6 +138,14 @@ xkb_symbols "phonetic-alt" {
};
partial alphanumeric_keys
+xkb_symbols "olpc-phonetic" {
+ include "am(phonetic-alt)"
+ name[Group1]= "Armenian (OLPC phonetic)";
+
+ include "group(olpc)"
+};
+
+partial alphanumeric_keys
xkb_symbols "eastern" {
name[Group1]="Armenian (eastern)";
diff --git a/xorg-server/xkeyboard-config/symbols/lt b/xorg-server/xkeyboard-config/symbols/lt
index 709d08a08..5435460ce 100644
--- a/xorg-server/xkeyboard-config/symbols/lt
+++ b/xorg-server/xkeyboard-config/symbols/lt
@@ -1,311 +1,314 @@
-// Separate keymaps merged into one file by Nerijus Baliūnas, 2002
-
-// Lithuanian Numeric layout - Lithuanian letters on the numeric row
-// based on Lithuanian keyboard map by Ričardas Čepas <rch@richard.eu.org>
-// 3rd and 4th levels added by Mantas Kriaučiūnas <mantas@akl.lt>, 2004
-// Minor modifications and cleanup by Rimas Kudelis <rq@akl.lt>, 2010
-//
-// If you want two layouts, use:
-// Option "XkbLayout" "lt,lt(us)"
-partial default alphanumeric_keys modifier_keys
-xkb_symbols "basic" {
-
- include "latin"
- include "eurosign(e)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ aogonek, Aogonek, 1, exclam ]};
- key <AE02> {[ ccaron, Ccaron, 2, at ]};
- key <AE03> {[ eogonek, Eogonek, 3, numbersign ]};
- key <AE04> {[ eabovedot, Eabovedot, 4, dollar ]};
- key <AE05> {[ iogonek, Iogonek, 5, percent ]};
- key <AE06> {[ scaron, Scaron, 6, asciicircum ]};
- key <AE07> {[ uogonek, Uogonek, 7, ampersand ]};
- key <AE08> {[ umacron, Umacron, 8, asterisk ]};
- key <AE09> {[ doublelowquotemark, parenleft, 9, parenleft ]};
- key <AE10> {[ leftdoublequotemark, parenright, 0, parenright ]};
- key <AE11> {[ minus, underscore, endash ]};
- key <AE12> {[ zcaron, Zcaron, equal, plus ]};
-
- key <LSGT> {[ endash, EuroSign ]};
-};
-
-// Similar to the above, but uses 3rd and 4th levels in the numeric row
-// for Lithuanian letters
-partial alphanumeric_keys modifier_keys
-xkb_symbols "us" {
-
- include "latin"
- include "eurosign(e)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (US keyboard with Lithuanian letters)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ 1, exclam, aogonek, Aogonek ]};
- key <AE02> {[ 2, at, ccaron, Ccaron ]};
- key <AE03> {[ 3, numbersign, eogonek, Eogonek ]};
- key <AE04> {[ 4, dollar, eabovedot, Eabovedot ]};
- key <AE05> {[ 5, percent, iogonek, Iogonek ]};
- key <AE06> {[ 6, asciicircum, scaron, Scaron ]};
- key <AE07> {[ 7, ampersand, uogonek, Uogonek ]};
- key <AE08> {[ 8, asterisk, umacron, Umacron ]};
- key <AE09> {[ 9, parenleft, doublelowquotemark, parenleft ]};
- key <AE10> {[ 0, parenright, leftdoublequotemark, parenright ]};
- key <AE11> {[ minus, underscore, endash ]};
- key <AE12> {[ equal, plus, zcaron, Zcaron ]};
-
- key <LSGT> {[ endash, EuroSign ]};
-};
-
-// Lithuanian keymap LST 1582:2000
-// The standard is described at http://ims.mii.lt/klav/
-// Extensions: B01 L3 is "<" , B02 L3 is ">" and B03 L3 is endash to make this
-// layout usable with pc101 and pc104 keyboards.
-//
-// Made by Gediminas Paulauskas <menesis@delfi.lt>
-// Minor modifications by Ričardas Čepas and Rimas Kudelis
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "std" {
-
- include "latin"
- include "eurosign(e)"
- include "nbsp(level3)"
- include "kpdl(comma)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (standard)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ exclam, 1, at ]};
- key <AE02> {[ minus, 2, underscore ]};
- key <AE03> {[ slash, 3, numbersign ]};
- key <AE04> {[ semicolon, 4, dollar ]};
- key <AE05> {[ colon, 5, section ]};
- key <AE06> {[ comma, 6, asciicircum ]};
- key <AE07> {[ period, 7, ampersand ]};
- key <AE08> {[ equal, 8, asterisk ]};
- key <AE09> {[ parenleft, 9, bracketleft ]};
- key <AE10> {[ parenright, 0, bracketright ]};
- key <AE11> {[ question, plus, apostrophe ]};
- key <AE12> {[ x, X, percent ]};
-
- key <AD01> {[ aogonek, Aogonek ]};
- key <AD02> {[ zcaron, Zcaron ]};
- key <AD11> {[ iogonek, Iogonek, braceleft ]};
- key <AD12> {[ w, W, braceright ]};
-
- key <AC04> {[ scaron, Scaron ]};
- key <AC10> {[ uogonek, Uogonek ]};
- key <AC11> {[ eabovedot, Eabovedot, quotedbl ]};
- key <BKSL> {[ q, Q, bar ]};
-
- key <LSGT> {[ less, greater, endash ]};
- key <AB01> {[ z, Z, less ]};
- key <AB02> {[ umacron, Umacron, greater ]};
- key <AB03> {[ c, C, endash ]};
- key <AB08> {[ ccaron, Ccaron, doublelowquotemark ]};
- key <AB09> {[ f, F, leftdoublequotemark ]};
- key <AB10> {[ eogonek, Eogonek, backslash ]};
-};
-
-// Lithuanian keymap LST 1205-92
-// This standard was made deprecated by LST 1582:2000 above.
-// This keyboard is also know as IBM layout.
-// We follow the map shown at: http://www.registrucentras.lt/litwin/kbdlta.gif
-// and info from Edis Tamošauskas <linas_lietus@yahoo.com>
-//
-// Made by Piter PUNK <piterpk@terra.com.br>
-// Minor modifications and cleanup by Rimas Kudelis, 2010
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "ibm" {
-
- include "latin"
- include "eurosign(e)"
- include "nbsp(level3)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (IBM LST 1205-92)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ exclam, 1 ]};
- key <AE02> {[ quotedbl, 2, at ]};
- key <AE03> {[ slash, 3, numbersign ]};
- key <AE04> {[ semicolon, 4, dollar ]};
- key <AE05> {[ colon, 5, percent ]};
- key <AE06> {[ comma, 6, asciicircum ]};
- key <AE07> {[ period, 7, ampersand ]};
- key <AE08> {[ question, 8, asterisk ]};
- key <AE09> {[ parenleft, 9 ]};
- key <AE10> {[ parenright, 0 ]};
- key <AE11> {[ underscore, minus, endash ]};
- key <AE12> {[ plus, equal ]};
-
- key <AD01> {[ aogonek, Aogonek, q, Q ]};
- key <AD02> {[ zcaron, Zcaron, w, W ]};
- key <AD11> {[ iogonek, Iogonek, bracketleft, braceleft ]};
- key <AD12> {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]};
-
- key <AC10> {[ uogonek, Uogonek, semicolon, colon ]};
- key <AC11> {[ eabovedot, Eabovedot, apostrophe, quotedbl ]};
-
- key <LSGT> {[ less, greater, endash ]};
- key <AB02> {[ umacron, Umacron, x, X ]};
- key <AB08> {[ ccaron, Ccaron, comma, less ]};
- key <AB09> {[ scaron, Scaron, period, greater ]};
- key <AB10> {[ eogonek, Eogonek, slash, question ]};
-};
-
-// LEKP and LEKPa layouts 1.0
-// For more info visit http://lekp.info
-// Created by Tautrimas Pajarskas, 2007
-// Made by Ernestas Lukoševičius, 2007
-// Minor cleanup by Rimas Kudelis, 2010
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "lekp" {
-
- include "capslock(backspace)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (LEKP)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ slash, numbersign, bar ]};
- key <AE02> {[ backslash, at, section ]};
- key <AE03> {[ period, braceleft ]};
- key <AE04> {[ comma, braceright ]};
- key <AE05> {[ f, F ]};
- key <AE06> {[ exclam, endash ]};
- key <AE07> {[ w, W ]};
- key <AE08> {[ uogonek, Uogonek ]};
- key <AE09> {[ iogonek, Iogonek ]};
- key <AE10> {[ parenleft, doublelowquotemark, registered ]};
- key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
- key <AE12> {[ colon, ampersand, trademark ]};
-
- key <AD01> {[ q, Q, EuroSign ]};
- key <AD02> {[ g, G, 7 ]};
- key <AD03> {[ r, R, 8 ]};
- key <AD04> {[ l, L, 9 ]};
- key <AD05> {[ d, D, percent ]};
- key <AD06> {[ ccaron, Ccaron ]};
- key <AD07> {[ j, J ]};
- key <AD08> {[ u, U, period ]};
- key <AD09> {[ eabovedot, Eabovedot, minus ]};
- key <AD10> {[ eogonek, Eogonek, slash ]};
- key <AD11> {[ question, bracketleft, division ]};
- key <AD12> {[ equal, bracketright ]};
-
- key <AC01> {[ a, A, 0 ]};
- key <AC02> {[ k, K, 4 ]};
- key <AC03> {[ s, S, 5 ]};
- key <AC04> {[ t, T, 6 ]};
- key <AC05> {[ m, M, dollar ]};
- key <AC06> {[ p, P ]};
- key <AC07> {[ n, N ]};
- key <AC08> {[ e, E, comma ]};
- key <AC09> {[ i, I, plus ]};
- key <AC10> {[ o, O, asterisk ]};
- key <AC11> {[ y, Y, multiply ]};
- key <BKSL> {[ apostrophe, underscore ]};
-
- key <LSGT> {[ semicolon, quotedbl, sterling ]};
- key <AB01> {[ z, Z, asciicircum ]};
- key <AB02> {[ x, X, 1 ]};
- key <AB03> {[ c, C, 2 ]};
- key <AB04> {[ v, V, 3 ]};
- key <AB05> {[ zcaron, Zcaron ]};
- key <AB06> {[ scaron, Scaron ]};
- key <AB07> {[ b, B, degree ]};
- key <AB08> {[ umacron, Umacron, less ]};
- key <AB09> {[ aogonek, Aogonek, greater ]};
- key <AB10> {[ h, H ]};
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "lekpa" {
-
- include "capslock(backspace)"
- include "level3(ralt_switch)"
-
- name[Group1]="Lithuanian (LEKPa)";
-
- key <TLDE> {[ grave, asciitilde, acute ]};
- key <AE01> {[ slash, quotedbl, bar ]};
- key <AE02> {[ backslash, at, section ]};
- key <AE03> {[ period, braceleft, numbersign ]};
- key <AE04> {[ comma, braceright, sterling ]};
- key <AE05> {[ f, F, ampersand ]};
- key <AE06> {[ exclam, endash ]};
- key <AE07> {[ w, W ]};
- key <AE08> {[ uogonek, Uogonek ]};
- key <AE09> {[ iogonek, Iogonek ]};
- key <AE10> {[ parenleft, doublelowquotemark, registered ]};
- key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
- key <AE12> {[ colon, semicolon, trademark ]};
-
- key <AD01> {[ q, Q, EuroSign ]};
- key <AD02> {[ g, G, 7 ]};
- key <AD03> {[ r, R, 8 ]};
- key <AD04> {[ l, L, 9 ]};
- key <AD05> {[ d, D, percent ]};
- key <AD06> {[ ccaron, Ccaron ]};
- key <AD07> {[ j, J ]};
- key <AD08> {[ u, U, period ]};
- key <AD09> {[ eabovedot, Eabovedot, minus ]};
- key <AD10> {[ eogonek, Eogonek, slash ]};
- key <AD11> {[ question, bracketleft, division ]};
- key <AD12> {[ equal, bracketright ]};
-
- key <AC01> {[ a, A, 0 ]};
- key <AC02> {[ k, K, 4 ]};
- key <AC03> {[ s, S, 5 ]};
- key <AC04> {[ t, T, 6 ]};
- key <AC05> {[ m, M, dollar ]};
- key <AC06> {[ p, P ]};
- key <AC07> {[ n, N ]};
- key <AC08> {[ e, E, comma ]};
- key <AC09> {[ i, I, plus ]};
- key <AC10> {[ o, O, asterisk ]};
- key <AC11> {[ y, Y, multiply ]};
- key <BKSL> {[ apostrophe, underscore ]};
-
- key <AB01> {[ z, Z, asciicircum ]};
- key <AB02> {[ x, X, 1 ]};
- key <AB03> {[ c, C, 2 ]};
- key <AB04> {[ v, V, 3 ]};
- key <AB05> {[ zcaron, Zcaron ]};
- key <AB06> {[ scaron, Scaron ]};
- key <AB07> {[ b, B, degree ]};
- key <AB08> {[ umacron, Umacron, less ]};
- key <AB09> {[ aogonek, Aogonek, greater ]};
- key <AB10> {[ h, H ]};
-};
-
-partial alphanumeric_keys modifier_keys
-xkb_symbols "dvorak" {
-
- include "us(dvorak)"
-
- name[Group1]="Lithuanian (Dvorak)";
-
- key <AE01> { [ aogonek, Aogonek, 1, exclam ] };
- key <AE02> { [ ccaron, Ccaron, 2, at ] };
- key <AE03> { [ eogonek, Eogonek, 3, numbersign ] };
- key <AE04> { [ eabovedot, Eabovedot, 4, dollar ] };
- key <AE05> { [ iogonek, Iogonek, 5, percent ] };
- key <AE06> { [ scaron, Scaron, 6, asciicircum ] };
- key <AE07> { [ uogonek, Uogonek, 7, ampersand ] };
- key <AE08> { [ umacron, Umacron, 8, asterisk ] };
- key <AE09> { [doublelowquotemark, parenleft, 9, parenleft ] };
- key <AE10> { [leftdoublequotemark,parenright, 0, parenright ] };
- key <AD12> { [ zcaron, Zcaron, equal, plus ] };
-
- include "level3(ralt_switch)"
-};
+// Separate keymaps merged into one file by Nerijus Baliūnas, 2002
+
+// Lithuanian Numeric layout - Lithuanian letters on the numeric row
+// based on Lithuanian keyboard map by Ričardas Čepas <rch@richard.eu.org>
+// 3rd and 4th levels added by Mantas Kriaučiūnas <mantas@akl.lt>, 2004
+// Minor modifications and cleanup by Rimas Kudelis <rq@akl.lt>, 2010
+//
+// If you want two layouts, use:
+// Option "XkbLayout" "lt,lt(us)"
+partial default alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ aogonek, Aogonek, 1, exclam ]};
+ key <AE02> {[ ccaron, Ccaron, 2, at ]};
+ key <AE03> {[ eogonek, Eogonek, 3, numbersign ]};
+ key <AE04> {[ eabovedot, Eabovedot, 4, dollar ]};
+ key <AE05> {[ iogonek, Iogonek, 5, percent ]};
+ key <AE06> {[ scaron, Scaron, 6, asciicircum ]};
+ key <AE07> {[ uogonek, Uogonek, 7, ampersand ]};
+ key <AE08> {[ umacron, Umacron, 8, asterisk ]};
+ key <AE09> {[ doublelowquotemark, parenleft, 9, parenleft ]};
+ key <AE10> {[ leftdoublequotemark, parenright, 0, parenright ]};
+ key <AE11> {[ minus, underscore, endash ]};
+ key <AE12> {[ zcaron, Zcaron, equal, plus ]};
+
+ key <LSGT> {[ endash, EuroSign ]};
+};
+
+// Similar to the above, but uses 3rd and 4th levels in the numeric row
+// for Lithuanian letters
+partial alphanumeric_keys modifier_keys
+xkb_symbols "us" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (US keyboard with Lithuanian letters)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ 1, exclam, aogonek, Aogonek ]};
+ key <AE02> {[ 2, at, ccaron, Ccaron ]};
+ key <AE03> {[ 3, numbersign, eogonek, Eogonek ]};
+ key <AE04> {[ 4, dollar, eabovedot, Eabovedot ]};
+ key <AE05> {[ 5, percent, iogonek, Iogonek ]};
+ key <AE06> {[ 6, asciicircum, scaron, Scaron ]};
+ key <AE07> {[ 7, ampersand, uogonek, Uogonek ]};
+ key <AE08> {[ 8, asterisk, umacron, Umacron ]};
+ key <AE09> {[ 9, parenleft, doublelowquotemark, parenleft ]};
+ key <AE10> {[ 0, parenright, leftdoublequotemark, parenright ]};
+ key <AE11> {[ minus, underscore, endash ]};
+ key <AE12> {[ equal, plus, zcaron, Zcaron ]};
+
+ key <LSGT> {[ endash, EuroSign ]};
+};
+
+// Lithuanian keymap LST 1582:2000
+// The standard is described at http://ims.mii.lt/klav/
+// Extensions: B01 L3 is "<" , B02 L3 is ">" and B03 L3 is endash to make this
+// layout usable with pc101 and pc104 keyboards.
+//
+// Made by Gediminas Paulauskas <menesis@delfi.lt>
+// Minor modifications by Ričardas Čepas and Rimas Kudelis
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "std" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "nbsp(level3)"
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (standard)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ exclam, 1, at ]};
+ key <AE02> {[ minus, 2, underscore ]};
+ key <AE03> {[ slash, 3, numbersign ]};
+ key <AE04> {[ semicolon, 4, dollar ]};
+ key <AE05> {[ colon, 5, section ]};
+ key <AE06> {[ comma, 6, asciicircum ]};
+ key <AE07> {[ period, 7, ampersand ]};
+ key <AE08> {[ equal, 8, asterisk ]};
+ key <AE09> {[ parenleft, 9, bracketleft ]};
+ key <AE10> {[ parenright, 0, bracketright ]};
+ key <AE11> {[ question, plus, apostrophe ]};
+ key <AE12> {[ x, X, percent ]};
+
+ key <AD01> {[ aogonek, Aogonek ]};
+ key <AD02> {[ zcaron, Zcaron ]};
+ key <AD11> {[ iogonek, Iogonek, braceleft ]};
+ key <AD12> {[ w, W, braceright ]};
+
+ key <AC04> {[ scaron, Scaron ]};
+ key <AC10> {[ uogonek, Uogonek ]};
+ key <AC11> {[ eabovedot, Eabovedot, quotedbl ]};
+ key <BKSL> {[ q, Q, bar ]};
+
+ key <LSGT> {[ less, greater, endash ]};
+ key <AB01> {[ z, Z, less ]};
+ key <AB02> {[ umacron, Umacron, greater ]};
+ key <AB03> {[ c, C, endash ]};
+ key <AB08> {[ ccaron, Ccaron, doublelowquotemark ]};
+ key <AB09> {[ f, F, leftdoublequotemark ]};
+ key <AB10> {[ eogonek, Eogonek, backslash ]};
+};
+
+// Lithuanian keymap LST 1205-92
+// This standard was made deprecated by LST 1582:2000 above.
+// This keyboard is also know as IBM layout.
+// We follow the map shown at: http://www.registrucentras.lt/litwin/kbdlta.gif
+// and info from Edis Tamošauskas <linas_lietus@yahoo.com>
+//
+// Made by Piter PUNK <piterpk@terra.com.br>
+// Minor modifications and cleanup by Rimas Kudelis, 2010
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ibm" {
+
+ include "latin"
+ include "eurosign(e)"
+ include "nbsp(level3)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (IBM LST 1205-92)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ exclam, 1 ]};
+ key <AE02> {[ quotedbl, 2, at ]};
+ key <AE03> {[ slash, 3, numbersign ]};
+ key <AE04> {[ semicolon, 4, dollar ]};
+ key <AE05> {[ colon, 5, percent ]};
+ key <AE06> {[ comma, 6, asciicircum ]};
+ key <AE07> {[ period, 7, ampersand ]};
+ key <AE08> {[ question, 8, asterisk ]};
+ key <AE09> {[ parenleft, 9 ]};
+ key <AE10> {[ parenright, 0 ]};
+ key <AE11> {[ underscore, minus, endash ]};
+ key <AE12> {[ plus, equal ]};
+
+ key <AD01> {[ aogonek, Aogonek, q, Q ]};
+ key <AD02> {[ zcaron, Zcaron, w, W ]};
+ key <AD11> {[ iogonek, Iogonek, bracketleft, braceleft ]};
+ key <AD12> {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]};
+
+ key <AC10> {[ uogonek, Uogonek, semicolon, colon ]};
+ key <AC11> {[ eabovedot, Eabovedot, apostrophe, quotedbl ]};
+
+ key <LSGT> {[ less, greater, endash ]};
+ key <AB02> {[ umacron, Umacron, x, X ]};
+ key <AB08> {[ ccaron, Ccaron, comma, less ]};
+ key <AB09> {[ scaron, Scaron, period, greater ]};
+ key <AB10> {[ eogonek, Eogonek, slash, question ]};
+};
+
+// LEKP and LEKPa layouts 1.0
+// For more info visit http://lekp.info
+// Created by Tautrimas Pajarskas, 2007
+// Made by Ernestas Lukoševičius, 2007
+// Minor cleanup by Rimas Kudelis, 2010
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "lekp" {
+
+ include "capslock(backspace)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (LEKP)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ slash, numbersign, bar ]};
+ key <AE02> {[ backslash, at, section ]};
+ key <AE03> {[ period, braceleft ]};
+ key <AE04> {[ comma, braceright ]};
+ key <AE05> {[ f, F ]};
+ key <AE06> {[ exclam, endash ]};
+ key <AE07> {[ w, W ]};
+ key <AE08> {[ uogonek, Uogonek ]};
+ key <AE09> {[ iogonek, Iogonek ]};
+ key <AE10> {[ parenleft, doublelowquotemark, registered ]};
+ key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
+ key <AE12> {[ colon, ampersand, trademark ]};
+
+ key <AD01> {[ q, Q, EuroSign ]};
+ key <AD02> {[ g, G, 7 ]};
+ key <AD03> {[ r, R, 8 ]};
+ key <AD04> {[ l, L, 9 ]};
+ key <AD05> {[ d, D, percent ]};
+ key <AD06> {[ ccaron, Ccaron ]};
+ key <AD07> {[ j, J ]};
+ key <AD08> {[ u, U, period ]};
+ key <AD09> {[ eabovedot, Eabovedot, minus ]};
+ key <AD10> {[ eogonek, Eogonek, slash ]};
+ key <AD11> {[ question, bracketleft, division ]};
+ key <AD12> {[ equal, bracketright ]};
+
+ key <AC01> {[ a, A, 0 ]};
+ key <AC02> {[ k, K, 4 ]};
+ key <AC03> {[ s, S, 5 ]};
+ key <AC04> {[ t, T, 6 ]};
+ key <AC05> {[ m, M, dollar ]};
+ key <AC06> {[ p, P ]};
+ key <AC07> {[ n, N ]};
+ key <AC08> {[ e, E, comma ]};
+ key <AC09> {[ i, I, plus ]};
+ key <AC10> {[ o, O, asterisk ]};
+ key <AC11> {[ y, Y, multiply ]};
+ key <BKSL> {[ apostrophe, underscore ]};
+
+ key <LSGT> {[ semicolon, quotedbl, sterling ]};
+ key <AB01> {[ z, Z, asciicircum ]};
+ key <AB02> {[ x, X, 1 ]};
+ key <AB03> {[ c, C, 2 ]};
+ key <AB04> {[ v, V, 3 ]};
+ key <AB05> {[ zcaron, Zcaron ]};
+ key <AB06> {[ scaron, Scaron ]};
+ key <AB07> {[ b, B, degree ]};
+ key <AB08> {[ umacron, Umacron, less ]};
+ key <AB09> {[ aogonek, Aogonek, greater ]};
+ key <AB10> {[ h, H ]};
+};
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "lekpa" {
+
+ include "capslock(backspace)"
+ include "level3(ralt_switch)"
+
+ name[Group1]="Lithuanian (LEKPa)";
+
+ key <TLDE> {[ grave, asciitilde, acute ]};
+ key <AE01> {[ slash, quotedbl, bar ]};
+ key <AE02> {[ backslash, at, section ]};
+ key <AE03> {[ period, braceleft, numbersign ]};
+ key <AE04> {[ comma, braceright, sterling ]};
+ key <AE05> {[ f, F, ampersand ]};
+ key <AE06> {[ exclam, endash ]};
+ key <AE07> {[ w, W ]};
+ key <AE08> {[ uogonek, Uogonek ]};
+ key <AE09> {[ iogonek, Iogonek ]};
+ key <AE10> {[ parenleft, doublelowquotemark, registered ]};
+ key <AE11> {[ parenright, leftdoublequotemark, copyright ]};
+ key <AE12> {[ colon, semicolon, trademark ]};
+
+ key <AD01> {[ q, Q, EuroSign ]};
+ key <AD02> {[ g, G, 7 ]};
+ key <AD03> {[ r, R, 8 ]};
+ key <AD04> {[ l, L, 9 ]};
+ key <AD05> {[ d, D, percent ]};
+ key <AD06> {[ ccaron, Ccaron ]};
+ key <AD07> {[ j, J ]};
+ key <AD08> {[ u, U, period ]};
+ key <AD09> {[ eabovedot, Eabovedot, minus ]};
+ key <AD10> {[ eogonek, Eogonek, slash ]};
+ key <AD11> {[ question, bracketleft, division ]};
+ key <AD12> {[ equal, bracketright ]};
+
+ key <AC01> {[ a, A, 0 ]};
+ key <AC02> {[ k, K, 4 ]};
+ key <AC03> {[ s, S, 5 ]};
+ key <AC04> {[ t, T, 6 ]};
+ key <AC05> {[ m, M, dollar ]};
+ key <AC06> {[ p, P ]};
+ key <AC07> {[ n, N ]};
+ key <AC08> {[ e, E, comma ]};
+ key <AC09> {[ i, I, plus ]};
+ key <AC10> {[ o, O, asterisk ]};
+ key <AC11> {[ y, Y, multiply ]};
+ key <BKSL> {[ apostrophe, underscore ]};
+
+ key <AB01> {[ z, Z, asciicircum ]};
+ key <AB02> {[ x, X, 1 ]};
+ key <AB03> {[ c, C, 2 ]};
+ key <AB04> {[ v, V, 3 ]};
+ key <AB05> {[ zcaron, Zcaron ]};
+ key <AB06> {[ scaron, Scaron ]};
+ key <AB07> {[ b, B, degree ]};
+ key <AB08> {[ umacron, Umacron, less ]};
+ key <AB09> {[ aogonek, Aogonek, greater ]};
+ key <AB10> {[ h, H ]};
+};
+
+// EXTRAS:
+
+partial alphanumeric_keys modifier_keys
+xkb_symbols "us_dvorak" {
+
+ include "us(dvorak)"
+
+ name[Group1]="Lithuanian (US Dvorak with Lithuanian letters)";
+
+ key <AE01> { [ 1, exclam, aogonek, Aogonek ] };
+ key <AE02> { [ 2, at, ccaron, Ccaron ] };
+ key <AE03> { [ 3, numbersign, eogonek, Eogonek ] };
+ key <AE04> { [ 4, dollar, eabovedot, Eabovedot ] };
+ key <AE05> { [ 5, percent, iogonek, Iogonek ] };
+ key <AE06> { [ 6, asciicircum, scaron, Scaron ] };
+ key <AE07> { [ 7, ampersand, uogonek, Uogonek ] };
+ key <AE08> { [ 8, asterisk, umacron, Umacron ] };
+ key <AE09> { [ 9, parenleft, doublelowquotemark, parenleft ] };
+ key <AE10> { [ 0, parenright, leftdoublequotemark,parenright ] };
+ key <AD12> { [ equal, plus, zcaron, Zcaron ] };
+
+ include "level3(ralt_switch)"
+};
+
diff --git a/xorg-server/xkeyboard-config/symbols/ru b/xorg-server/xkeyboard-config/symbols/ru
index 7cbb28f46..fdf82539d 100644
--- a/xorg-server/xkeyboard-config/symbols/ru
+++ b/xorg-server/xkeyboard-config/symbols/ru
@@ -586,3 +586,68 @@ xkb_symbols "chu"
key <AB09> { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] };
key <AB10> { [ period, comma, semicolon, exclam ] };
};
+
+
+// RUU (Russian-Ukrainian United keyboard layout).
+// Modified Russian standart keyboard with third level contains ukrainian
+// and belorusian alphabetic letters and commonly used Unicode symbols.
+// Description http://wiki.opennet.ru/RUU [russian]
+// Vasyĺ V. Vercynśkyj <fuckel@ukr.net>
+// Last Changes 2011/05/11
+//
+// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
+// │ ' ~ │ ! ≈ │ " ∞ │ № ₴ │ ; € │ % ‰ │ : ≤ │ ? ≥ │ * × │ ( { │ ) } │ _ – │ + ± ┃ ⌫ ┃
+// │ ’ ́ │ 1 ÷ │ 2 ¤ │ 3 § │ 4 $ │ 5 ° │ 6 < │ 7 > │ 8 • │ 9 [ │ 0 ] │ - — │ = ≠ ┃Backspace┃
+// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
+// ┃ ┃ Й │ Ц │ У Ў │ К │ Е Ё │ Н │ Г Ґ │ Ш │ Щ │ З │ Х │ Ъ Ї ┃ Enter ┃
+// ┃ Tab ↹ ┃ й │ ц │ у ў │ к ® │ е ё │ н │ г ґ │ ш │ щ │ з │ х │ ъ ї ┃ ⏎ ┃
+// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓ ┃
+// ┃ Caps ┃ Ф │ Ы І │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э Є │ | ¦ ┃ ┃
+// ┃ Lock ⇬ ┃ ф │ ы і │ в │ а │ п │ р │ о │ л │ д │ ж │ э є │ / \ ┃ ┃
+// ┣━━━━━━━━┻━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┲━━━┷━━━━━┻━━━━━━┫
+// ┃ ┃ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б „ │ Ю “ │ , … ┃ ┃
+// ┃ Shift ⇧ ┃ я │ ч │ с © │ м │ и │ т ™ │ ь µ │ б « │ ю » │ . / ┃ Shift ⇧ ┃
+// ┣━━━━━━━┳━━┻━━━━┳┷━━━━━┷┱────┴─────┴─────┴─────┴─────┴─────┴┲━━━━┷━━┳━━┻━━━━┳━━━━━━━┳━━━┛
+// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
+// ┃ Ctrl ┃ Meta ┃ Alt ┃ Space ┃AltGr ⇮┃ Menu ┃ Ctrl ┃
+// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
+
+
+
+partial alphanumeric_keys
+xkb_symbols "ruu" {
+ include "ru(common)"
+
+ name[Group1]= "Russian (with UKR and BEL layout)";
+
+ key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
+ key <AE01> { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To
+ key <AE02> { [ 2, quotedbl, currency, infinity ] };
+ key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
+ key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
+ key <AE05> { [ 5, percent, degree, U2030 ] }; // Per Mille Sign
+ key <AE06> { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To
+ key <AE07> { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To
+ key <AE08> { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign
+ key <AE09> { [ 9, parenleft, bracketleft, braceleft ] };
+ key <AE10> { [ 0, parenright, bracketright, braceright ] };
+ key <AE11> { [ minus, underscore, emdash, endash ] };
+ key <AE12> { [ equal, plus, notequal, plusminus ] };
+ key <AD03> { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] };
+ key <AD04> { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm
+ key <AD05> { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] };
+ key <AD07> { [Cyrillic_ge, Cyrillic_GE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] };
+ key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign
+ key <AD12> { [Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] };
+ key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] };
+ key <AC11> { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie,Ukrainian_IE ] };
+ key <BKSL> { [ slash, bar, backslash, U00A6 ] }; // Broken Bar
+ key <AB03> { [ Cyrillic_es, Cyrillic_ES, copyright ] };
+ key <AB06> { [ Cyrillic_te, Cyrillic_TE, trademark ] };
+ key <AB07> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign
+ key <AB08> { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] };
+ key <AB09> { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] };
+ key <AB10> { [ period, comma, slash, ellipsis ] };
+
+ include "level3(ralt_switch)"
+};