From 35484135119fcf55fe1cbb1fcdd0e035f581fcfb Mon Sep 17 00:00:00 2001 From: marha Date: Wed, 18 May 2011 07:21:08 +0000 Subject: xkeyboard-config libX11 pixman mesa git update 18 May 2011 --- libX11/include/X11/Xlibint.h | 2 +- libX11/man/DisplayOfCCC.man | 2 +- libX11/man/Makefile.am | 2162 ++++----- libX11/man/XChangeKeyboardMapping.man | 2 +- libX11/man/xkb/XkbPtrActionX.man | 208 +- libX11/man/xkb/XkbPtrActionY.man | 208 +- libX11/man/xkb/XkbSetPtrActionX.man | 216 +- libX11/man/xkb/XkbSetPtrActionY.man | 216 +- mesalib/src/gallium/auxiliary/util/u_vbuf_mgr.c | 7 +- mesalib/src/mesa/main/dlist.c | 22 +- mesalib/src/mesa/main/fbobject.c | 5076 ++++++++++---------- mesalib/src/mesa/main/texrender.c | 1311 +++-- pixman/test/composite.c | 4 +- xorg-server/xkeyboard-config/configure.in | 248 +- .../xkeyboard-config/po/xkeyboard-config.pot | 1972 ++++---- .../xkeyboard-config/rules/base.extras.xml.in | 44 +- xorg-server/xkeyboard-config/rules/base.xml.in | 12 +- xorg-server/xkeyboard-config/symbols/am | 8 + xorg-server/xkeyboard-config/symbols/lt | 625 +-- 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 \n" "Language-Team: LANGUAGE \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 @@ apl - <_shortDescription>APL + <_shortDescription>apl <_description>APL Keyboard Symbols eng @@ -39,7 +39,7 @@ ir - <_shortDescription>Iran + <_shortDescription>fa <_description>Persian per @@ -56,15 +56,15 @@ lt - <_shortDescription>Ltu + <_shortDescription>lt <_description>Lithuanian lit - dvorak - <_description>Lithuanian (Dvorak) + us_dvorak + <_description>Lithuanian (US Dvorak with Lithuanian letters) @@ -184,7 +184,7 @@ ro - <_shortDescription>Rou + <_shortDescription>ro <_description>Romanian rum @@ -200,7 +200,7 @@ rs - <_shortDescription>Srb + <_shortDescription>sr <_description>Serbian srp @@ -216,7 +216,7 @@ ru - <_shortDescription>Rus + <_shortDescription>ru <_description>Russian @@ -227,6 +227,34 @@ chu + + + ruu + <_shortDescription>ru + <_description>Russian (with UKR and BEL layout) + rus + ukr + bel + + + + + + + am + <_shortDescription>hy + <_description>Armenian + + hye + + + + + + olpc-phonetic + <_description>Armenian (alternative phonetic for OLPC) + + 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 @@ af - <_shortDescription>Afg + <_shortDescription>fa <_description>Afghani @@ -2581,7 +2581,7 @@ iq - <_shortDescription>irq + <_shortDescription>ar <_description>Iraqi ara kur @@ -3581,7 +3581,7 @@ me - <_shortDescription>srp + <_shortDescription>sr <_description>Montenegrin srp @@ -4310,7 +4310,7 @@ ch - <_shortDescription>che + <_shortDescription>de <_description>German (Switzerland) ger gsw @@ -4613,7 +4613,7 @@ tw - <_shortDescription>twn + <_shortDescription>zh <_description>Taiwanese trv @@ -4708,7 +4708,7 @@ gb - <_shortDescription>GBr + <_shortDescription>en <_description>English (UK) eng 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 @@ -137,6 +137,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" { 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 -// 3rd and 4th levels added by Mantas Kriaučiūnas , 2004 -// Minor modifications and cleanup by Rimas Kudelis , 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 {[ grave, asciitilde, acute ]}; - key {[ aogonek, Aogonek, 1, exclam ]}; - key {[ ccaron, Ccaron, 2, at ]}; - key {[ eogonek, Eogonek, 3, numbersign ]}; - key {[ eabovedot, Eabovedot, 4, dollar ]}; - key {[ iogonek, Iogonek, 5, percent ]}; - key {[ scaron, Scaron, 6, asciicircum ]}; - key {[ uogonek, Uogonek, 7, ampersand ]}; - key {[ umacron, Umacron, 8, asterisk ]}; - key {[ doublelowquotemark, parenleft, 9, parenleft ]}; - key {[ leftdoublequotemark, parenright, 0, parenright ]}; - key {[ minus, underscore, endash ]}; - key {[ zcaron, Zcaron, equal, plus ]}; - - key {[ 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 {[ grave, asciitilde, acute ]}; - key {[ 1, exclam, aogonek, Aogonek ]}; - key {[ 2, at, ccaron, Ccaron ]}; - key {[ 3, numbersign, eogonek, Eogonek ]}; - key {[ 4, dollar, eabovedot, Eabovedot ]}; - key {[ 5, percent, iogonek, Iogonek ]}; - key {[ 6, asciicircum, scaron, Scaron ]}; - key {[ 7, ampersand, uogonek, Uogonek ]}; - key {[ 8, asterisk, umacron, Umacron ]}; - key {[ 9, parenleft, doublelowquotemark, parenleft ]}; - key {[ 0, parenright, leftdoublequotemark, parenright ]}; - key {[ minus, underscore, endash ]}; - key {[ equal, plus, zcaron, Zcaron ]}; - - key {[ 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 -// 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 {[ grave, asciitilde, acute ]}; - key {[ exclam, 1, at ]}; - key {[ minus, 2, underscore ]}; - key {[ slash, 3, numbersign ]}; - key {[ semicolon, 4, dollar ]}; - key {[ colon, 5, section ]}; - key {[ comma, 6, asciicircum ]}; - key {[ period, 7, ampersand ]}; - key {[ equal, 8, asterisk ]}; - key {[ parenleft, 9, bracketleft ]}; - key {[ parenright, 0, bracketright ]}; - key {[ question, plus, apostrophe ]}; - key {[ x, X, percent ]}; - - key {[ aogonek, Aogonek ]}; - key {[ zcaron, Zcaron ]}; - key {[ iogonek, Iogonek, braceleft ]}; - key {[ w, W, braceright ]}; - - key {[ scaron, Scaron ]}; - key {[ uogonek, Uogonek ]}; - key {[ eabovedot, Eabovedot, quotedbl ]}; - key {[ q, Q, bar ]}; - - key {[ less, greater, endash ]}; - key {[ z, Z, less ]}; - key {[ umacron, Umacron, greater ]}; - key {[ c, C, endash ]}; - key {[ ccaron, Ccaron, doublelowquotemark ]}; - key {[ f, F, leftdoublequotemark ]}; - key {[ 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 -// -// Made by Piter PUNK -// 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 {[ grave, asciitilde, acute ]}; - key {[ exclam, 1 ]}; - key {[ quotedbl, 2, at ]}; - key {[ slash, 3, numbersign ]}; - key {[ semicolon, 4, dollar ]}; - key {[ colon, 5, percent ]}; - key {[ comma, 6, asciicircum ]}; - key {[ period, 7, ampersand ]}; - key {[ question, 8, asterisk ]}; - key {[ parenleft, 9 ]}; - key {[ parenright, 0 ]}; - key {[ underscore, minus, endash ]}; - key {[ plus, equal ]}; - - key {[ aogonek, Aogonek, q, Q ]}; - key {[ zcaron, Zcaron, w, W ]}; - key {[ iogonek, Iogonek, bracketleft, braceleft ]}; - key {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]}; - - key {[ uogonek, Uogonek, semicolon, colon ]}; - key {[ eabovedot, Eabovedot, apostrophe, quotedbl ]}; - - key {[ less, greater, endash ]}; - key {[ umacron, Umacron, x, X ]}; - key {[ ccaron, Ccaron, comma, less ]}; - key {[ scaron, Scaron, period, greater ]}; - key {[ 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 {[ grave, asciitilde, acute ]}; - key {[ slash, numbersign, bar ]}; - key {[ backslash, at, section ]}; - key {[ period, braceleft ]}; - key {[ comma, braceright ]}; - key {[ f, F ]}; - key {[ exclam, endash ]}; - key {[ w, W ]}; - key {[ uogonek, Uogonek ]}; - key {[ iogonek, Iogonek ]}; - key {[ parenleft, doublelowquotemark, registered ]}; - key {[ parenright, leftdoublequotemark, copyright ]}; - key {[ colon, ampersand, trademark ]}; - - key {[ q, Q, EuroSign ]}; - key {[ g, G, 7 ]}; - key {[ r, R, 8 ]}; - key {[ l, L, 9 ]}; - key {[ d, D, percent ]}; - key {[ ccaron, Ccaron ]}; - key {[ j, J ]}; - key {[ u, U, period ]}; - key {[ eabovedot, Eabovedot, minus ]}; - key {[ eogonek, Eogonek, slash ]}; - key {[ question, bracketleft, division ]}; - key {[ equal, bracketright ]}; - - key {[ a, A, 0 ]}; - key {[ k, K, 4 ]}; - key {[ s, S, 5 ]}; - key {[ t, T, 6 ]}; - key {[ m, M, dollar ]}; - key {[ p, P ]}; - key {[ n, N ]}; - key {[ e, E, comma ]}; - key {[ i, I, plus ]}; - key {[ o, O, asterisk ]}; - key {[ y, Y, multiply ]}; - key {[ apostrophe, underscore ]}; - - key {[ semicolon, quotedbl, sterling ]}; - key {[ z, Z, asciicircum ]}; - key {[ x, X, 1 ]}; - key {[ c, C, 2 ]}; - key {[ v, V, 3 ]}; - key {[ zcaron, Zcaron ]}; - key {[ scaron, Scaron ]}; - key {[ b, B, degree ]}; - key {[ umacron, Umacron, less ]}; - key {[ aogonek, Aogonek, greater ]}; - key {[ h, H ]}; -}; - -partial alphanumeric_keys modifier_keys -xkb_symbols "lekpa" { - - include "capslock(backspace)" - include "level3(ralt_switch)" - - name[Group1]="Lithuanian (LEKPa)"; - - key {[ grave, asciitilde, acute ]}; - key {[ slash, quotedbl, bar ]}; - key {[ backslash, at, section ]}; - key {[ period, braceleft, numbersign ]}; - key {[ comma, braceright, sterling ]}; - key {[ f, F, ampersand ]}; - key {[ exclam, endash ]}; - key {[ w, W ]}; - key {[ uogonek, Uogonek ]}; - key {[ iogonek, Iogonek ]}; - key {[ parenleft, doublelowquotemark, registered ]}; - key {[ parenright, leftdoublequotemark, copyright ]}; - key {[ colon, semicolon, trademark ]}; - - key {[ q, Q, EuroSign ]}; - key {[ g, G, 7 ]}; - key {[ r, R, 8 ]}; - key {[ l, L, 9 ]}; - key {[ d, D, percent ]}; - key {[ ccaron, Ccaron ]}; - key {[ j, J ]}; - key {[ u, U, period ]}; - key {[ eabovedot, Eabovedot, minus ]}; - key {[ eogonek, Eogonek, slash ]}; - key {[ question, bracketleft, division ]}; - key {[ equal, bracketright ]}; - - key {[ a, A, 0 ]}; - key {[ k, K, 4 ]}; - key {[ s, S, 5 ]}; - key {[ t, T, 6 ]}; - key {[ m, M, dollar ]}; - key {[ p, P ]}; - key {[ n, N ]}; - key {[ e, E, comma ]}; - key {[ i, I, plus ]}; - key {[ o, O, asterisk ]}; - key {[ y, Y, multiply ]}; - key {[ apostrophe, underscore ]}; - - key {[ z, Z, asciicircum ]}; - key {[ x, X, 1 ]}; - key {[ c, C, 2 ]}; - key {[ v, V, 3 ]}; - key {[ zcaron, Zcaron ]}; - key {[ scaron, Scaron ]}; - key {[ b, B, degree ]}; - key {[ umacron, Umacron, less ]}; - key {[ aogonek, Aogonek, greater ]}; - key {[ h, H ]}; -}; - -partial alphanumeric_keys modifier_keys -xkb_symbols "dvorak" { - - include "us(dvorak)" - - name[Group1]="Lithuanian (Dvorak)"; - - key { [ aogonek, Aogonek, 1, exclam ] }; - key { [ ccaron, Ccaron, 2, at ] }; - key { [ eogonek, Eogonek, 3, numbersign ] }; - key { [ eabovedot, Eabovedot, 4, dollar ] }; - key { [ iogonek, Iogonek, 5, percent ] }; - key { [ scaron, Scaron, 6, asciicircum ] }; - key { [ uogonek, Uogonek, 7, ampersand ] }; - key { [ umacron, Umacron, 8, asterisk ] }; - key { [doublelowquotemark, parenleft, 9, parenleft ] }; - key { [leftdoublequotemark,parenright, 0, parenright ] }; - key { [ 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 +// 3rd and 4th levels added by Mantas Kriaučiūnas , 2004 +// Minor modifications and cleanup by Rimas Kudelis , 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 {[ grave, asciitilde, acute ]}; + key {[ aogonek, Aogonek, 1, exclam ]}; + key {[ ccaron, Ccaron, 2, at ]}; + key {[ eogonek, Eogonek, 3, numbersign ]}; + key {[ eabovedot, Eabovedot, 4, dollar ]}; + key {[ iogonek, Iogonek, 5, percent ]}; + key {[ scaron, Scaron, 6, asciicircum ]}; + key {[ uogonek, Uogonek, 7, ampersand ]}; + key {[ umacron, Umacron, 8, asterisk ]}; + key {[ doublelowquotemark, parenleft, 9, parenleft ]}; + key {[ leftdoublequotemark, parenright, 0, parenright ]}; + key {[ minus, underscore, endash ]}; + key {[ zcaron, Zcaron, equal, plus ]}; + + key {[ 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 {[ grave, asciitilde, acute ]}; + key {[ 1, exclam, aogonek, Aogonek ]}; + key {[ 2, at, ccaron, Ccaron ]}; + key {[ 3, numbersign, eogonek, Eogonek ]}; + key {[ 4, dollar, eabovedot, Eabovedot ]}; + key {[ 5, percent, iogonek, Iogonek ]}; + key {[ 6, asciicircum, scaron, Scaron ]}; + key {[ 7, ampersand, uogonek, Uogonek ]}; + key {[ 8, asterisk, umacron, Umacron ]}; + key {[ 9, parenleft, doublelowquotemark, parenleft ]}; + key {[ 0, parenright, leftdoublequotemark, parenright ]}; + key {[ minus, underscore, endash ]}; + key {[ equal, plus, zcaron, Zcaron ]}; + + key {[ 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 +// 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 {[ grave, asciitilde, acute ]}; + key {[ exclam, 1, at ]}; + key {[ minus, 2, underscore ]}; + key {[ slash, 3, numbersign ]}; + key {[ semicolon, 4, dollar ]}; + key {[ colon, 5, section ]}; + key {[ comma, 6, asciicircum ]}; + key {[ period, 7, ampersand ]}; + key {[ equal, 8, asterisk ]}; + key {[ parenleft, 9, bracketleft ]}; + key {[ parenright, 0, bracketright ]}; + key {[ question, plus, apostrophe ]}; + key {[ x, X, percent ]}; + + key {[ aogonek, Aogonek ]}; + key {[ zcaron, Zcaron ]}; + key {[ iogonek, Iogonek, braceleft ]}; + key {[ w, W, braceright ]}; + + key {[ scaron, Scaron ]}; + key {[ uogonek, Uogonek ]}; + key {[ eabovedot, Eabovedot, quotedbl ]}; + key {[ q, Q, bar ]}; + + key {[ less, greater, endash ]}; + key {[ z, Z, less ]}; + key {[ umacron, Umacron, greater ]}; + key {[ c, C, endash ]}; + key {[ ccaron, Ccaron, doublelowquotemark ]}; + key {[ f, F, leftdoublequotemark ]}; + key {[ 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 +// +// Made by Piter PUNK +// 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 {[ grave, asciitilde, acute ]}; + key {[ exclam, 1 ]}; + key {[ quotedbl, 2, at ]}; + key {[ slash, 3, numbersign ]}; + key {[ semicolon, 4, dollar ]}; + key {[ colon, 5, percent ]}; + key {[ comma, 6, asciicircum ]}; + key {[ period, 7, ampersand ]}; + key {[ question, 8, asterisk ]}; + key {[ parenleft, 9 ]}; + key {[ parenright, 0 ]}; + key {[ underscore, minus, endash ]}; + key {[ plus, equal ]}; + + key {[ aogonek, Aogonek, q, Q ]}; + key {[ zcaron, Zcaron, w, W ]}; + key {[ iogonek, Iogonek, bracketleft, braceleft ]}; + key {[ doublelowquotemark, leftdoublequotemark, bracketright, braceright ]}; + + key {[ uogonek, Uogonek, semicolon, colon ]}; + key {[ eabovedot, Eabovedot, apostrophe, quotedbl ]}; + + key {[ less, greater, endash ]}; + key {[ umacron, Umacron, x, X ]}; + key {[ ccaron, Ccaron, comma, less ]}; + key {[ scaron, Scaron, period, greater ]}; + key {[ 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 {[ grave, asciitilde, acute ]}; + key {[ slash, numbersign, bar ]}; + key {[ backslash, at, section ]}; + key {[ period, braceleft ]}; + key {[ comma, braceright ]}; + key {[ f, F ]}; + key {[ exclam, endash ]}; + key {[ w, W ]}; + key {[ uogonek, Uogonek ]}; + key {[ iogonek, Iogonek ]}; + key {[ parenleft, doublelowquotemark, registered ]}; + key {[ parenright, leftdoublequotemark, copyright ]}; + key {[ colon, ampersand, trademark ]}; + + key {[ q, Q, EuroSign ]}; + key {[ g, G, 7 ]}; + key {[ r, R, 8 ]}; + key {[ l, L, 9 ]}; + key {[ d, D, percent ]}; + key {[ ccaron, Ccaron ]}; + key {[ j, J ]}; + key {[ u, U, period ]}; + key {[ eabovedot, Eabovedot, minus ]}; + key {[ eogonek, Eogonek, slash ]}; + key {[ question, bracketleft, division ]}; + key {[ equal, bracketright ]}; + + key {[ a, A, 0 ]}; + key {[ k, K, 4 ]}; + key {[ s, S, 5 ]}; + key {[ t, T, 6 ]}; + key {[ m, M, dollar ]}; + key {[ p, P ]}; + key {[ n, N ]}; + key {[ e, E, comma ]}; + key {[ i, I, plus ]}; + key {[ o, O, asterisk ]}; + key {[ y, Y, multiply ]}; + key {[ apostrophe, underscore ]}; + + key {[ semicolon, quotedbl, sterling ]}; + key {[ z, Z, asciicircum ]}; + key {[ x, X, 1 ]}; + key {[ c, C, 2 ]}; + key {[ v, V, 3 ]}; + key {[ zcaron, Zcaron ]}; + key {[ scaron, Scaron ]}; + key {[ b, B, degree ]}; + key {[ umacron, Umacron, less ]}; + key {[ aogonek, Aogonek, greater ]}; + key {[ h, H ]}; +}; + +partial alphanumeric_keys modifier_keys +xkb_symbols "lekpa" { + + include "capslock(backspace)" + include "level3(ralt_switch)" + + name[Group1]="Lithuanian (LEKPa)"; + + key {[ grave, asciitilde, acute ]}; + key {[ slash, quotedbl, bar ]}; + key {[ backslash, at, section ]}; + key {[ period, braceleft, numbersign ]}; + key {[ comma, braceright, sterling ]}; + key {[ f, F, ampersand ]}; + key {[ exclam, endash ]}; + key {[ w, W ]}; + key {[ uogonek, Uogonek ]}; + key {[ iogonek, Iogonek ]}; + key {[ parenleft, doublelowquotemark, registered ]}; + key {[ parenright, leftdoublequotemark, copyright ]}; + key {[ colon, semicolon, trademark ]}; + + key {[ q, Q, EuroSign ]}; + key {[ g, G, 7 ]}; + key {[ r, R, 8 ]}; + key {[ l, L, 9 ]}; + key {[ d, D, percent ]}; + key {[ ccaron, Ccaron ]}; + key {[ j, J ]}; + key {[ u, U, period ]}; + key {[ eabovedot, Eabovedot, minus ]}; + key {[ eogonek, Eogonek, slash ]}; + key {[ question, bracketleft, division ]}; + key {[ equal, bracketright ]}; + + key {[ a, A, 0 ]}; + key {[ k, K, 4 ]}; + key {[ s, S, 5 ]}; + key {[ t, T, 6 ]}; + key {[ m, M, dollar ]}; + key {[ p, P ]}; + key {[ n, N ]}; + key {[ e, E, comma ]}; + key {[ i, I, plus ]}; + key {[ o, O, asterisk ]}; + key {[ y, Y, multiply ]}; + key {[ apostrophe, underscore ]}; + + key {[ z, Z, asciicircum ]}; + key {[ x, X, 1 ]}; + key {[ c, C, 2 ]}; + key {[ v, V, 3 ]}; + key {[ zcaron, Zcaron ]}; + key {[ scaron, Scaron ]}; + key {[ b, B, degree ]}; + key {[ umacron, Umacron, less ]}; + key {[ aogonek, Aogonek, greater ]}; + key {[ h, H ]}; +}; + +// EXTRAS: + +partial alphanumeric_keys modifier_keys +xkb_symbols "us_dvorak" { + + include "us(dvorak)" + + name[Group1]="Lithuanian (US Dvorak with Lithuanian letters)"; + + key { [ 1, exclam, aogonek, Aogonek ] }; + key { [ 2, at, ccaron, Ccaron ] }; + key { [ 3, numbersign, eogonek, Eogonek ] }; + key { [ 4, dollar, eabovedot, Eabovedot ] }; + key { [ 5, percent, iogonek, Iogonek ] }; + key { [ 6, asciicircum, scaron, Scaron ] }; + key { [ 7, ampersand, uogonek, Uogonek ] }; + key { [ 8, asterisk, umacron, Umacron ] }; + key { [ 9, parenleft, doublelowquotemark, parenleft ] }; + key { [ 0, parenright, leftdoublequotemark,parenright ] }; + key { [ 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 { [ Cyrillic_yu, Cyrillic_YU, U2DFB ] }; key { [ 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 +// 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 { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol + key { [ 1, exclam, U00F7, U2248 ] }; // Division Sign and Almost Equal To + key { [ 2, quotedbl, currency, infinity ] }; + key { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign + key { [ 4, semicolon, dollar, EuroSign ] }; + key { [ 5, percent, degree, U2030 ] }; // Per Mille Sign + key { [ 6, colon, less, U2264 ] }; // Less-Than Or Equal To + key { [ 7, question, greater, U2265 ] }; // Greater-Than Or Equal To + key { [ 8, asterisk, enfilledcircbullet, U00D7 ] }; // Multiplication Sign + key { [ 9, parenleft, bracketleft, braceleft ] }; + key { [ 0, parenright, bracketright, braceright ] }; + key { [ minus, underscore, emdash, endash ] }; + key { [ equal, plus, notequal, plusminus ] }; + key { [ Cyrillic_u, Cyrillic_U, Byelorussian_shortu, Byelorussian_SHORTU ] }; + key { [ Cyrillic_ka, Cyrillic_KA, registered ] }; // Registered tm + key { [ Cyrillic_ie, Cyrillic_IE, Cyrillic_io, Cyrillic_IO ] }; + key { [Cyrillic_ge, Cyrillic_GE, Ukrainian_ghe_with_upturn, Ukrainian_GHE_WITH_UPTURN ] }; + key { [ Cyrillic_ze, Cyrillic_ZE, U00B6 ] }; // Pilcrow Sign + key { [Cyrillic_hardsign, Cyrillic_HARDSIGN, Ukrainian_yi, Ukrainian_YI ] }; + key { [ Cyrillic_yeru, Cyrillic_YERU, Ukrainian_i, Ukrainian_I ] }; + key { [ Cyrillic_e, Cyrillic_E, Ukrainian_ie,Ukrainian_IE ] }; + key { [ slash, bar, backslash, U00A6 ] }; // Broken Bar + key { [ Cyrillic_es, Cyrillic_ES, copyright ] }; + key { [ Cyrillic_te, Cyrillic_TE, trademark ] }; + key { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, U00B5 ] }; // Micro Sign + key { [ Cyrillic_be, Cyrillic_BE, guillemotleft, doublelowquotemark ] }; + key { [ Cyrillic_yu, Cyrillic_YU, guillemotright, leftdoublequotemark ] }; + key { [ period, comma, slash, ellipsis ] }; + + include "level3(ralt_switch)" +}; -- cgit v1.2.3