diff options
-rw-r--r-- | libX11/include/X11/Xlibint.h | 2 | ||||
-rw-r--r-- | libX11/man/DisplayOfCCC.man | 2 | ||||
-rw-r--r-- | libX11/man/Makefile.am | 2162 | ||||
-rw-r--r-- | libX11/man/XChangeKeyboardMapping.man | 2 | ||||
-rw-r--r-- | libX11/man/xkb/XkbPtrActionX.man | 208 | ||||
-rw-r--r-- | libX11/man/xkb/XkbPtrActionY.man | 208 | ||||
-rw-r--r-- | libX11/man/xkb/XkbSetPtrActionX.man | 216 | ||||
-rw-r--r-- | libX11/man/xkb/XkbSetPtrActionY.man | 216 | ||||
-rw-r--r-- | mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c | 7 | ||||
-rw-r--r-- | mesalib/src/mesa/main/dlist.c | 22 | ||||
-rw-r--r-- | mesalib/src/mesa/main/fbobject.c | 5076 | ||||
-rw-r--r-- | mesalib/src/mesa/main/texrender.c | 1311 | ||||
-rw-r--r-- | pixman/test/composite.c | 4 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/configure.in | 248 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/po/xkeyboard-config.pot | 1972 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/rules/base.extras.xml.in | 44 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/rules/base.xml.in | 12 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/am | 8 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/lt | 625 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/ru | 65 |
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 <\\|> 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 <\\|> 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+<key>) 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+<key>) 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)" +}; |