xserver: Branch 'master'

Adam Jackson ajax at kemper.freedesktop.org
Thu Jan 12 18:35:34 UTC 2017


 hw/xfree86/os-support/linux/Makefile.am |    5 
 hw/xfree86/ramdac/Makefile.am           |    2 
 hw/xfree86/ramdac/xf86Cursor.c          |  511 --------------------------------
 hw/xfree86/ramdac/xf86CursorRD.c        |  511 ++++++++++++++++++++++++++++++++
 test/Makefile.am                        |    6 
 test/test_xkb.c                         |  174 ++++++++++
 test/xkb.c                              |  174 ----------
 7 files changed, 692 insertions(+), 691 deletions(-)

New commits:
commit 45546219e117c1b6129fd9f9be2ce5b592486feb
Author: Mihail Konev <k.mvc at ya.ru>
Date:   Tue Jan 3 23:40:18 2017 +0500

    tests: Avoid libtool message
    
    The "copying selected object files" message appears as some source
    files have the same name, and some objects are included twice.
    
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Signed-off-by: Mihail Konev <k.mvc at ya.ru>

diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index d8cb177..26e40bb 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -9,7 +9,10 @@ liblinuxev56_la_SOURCES = lnx_ev56.c
 endif
 
 if LNXACPI
-ACPI_SRCS = lnx_acpi.c lnx_apm.c
+ACPI_SRCS = lnx_acpi.c
+if !LNXAPM
+ACPI_SRCS += lnx_apm.c
+endif
 XORG_CFLAGS += -DHAVE_ACPI
 endif
 
diff --git a/hw/xfree86/ramdac/Makefile.am b/hw/xfree86/ramdac/Makefile.am
index a3d7762..59e0996 100644
--- a/hw/xfree86/ramdac/Makefile.am
+++ b/hw/xfree86/ramdac/Makefile.am
@@ -1,7 +1,7 @@
 noinst_LTLIBRARIES = libramdac.la
 
 libramdac_la_SOURCES = xf86RamDac.c xf86RamDacCmap.c \
-                      xf86Cursor.c xf86HWCurs.c IBM.c BT.c TI.c
+                       xf86CursorRD.c xf86HWCurs.c IBM.c BT.c TI.c
 
 sdk_HEADERS = BT.h IBM.h TI.h xf86Cursor.h xf86RamDac.h
 
diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
deleted file mode 100644
index afcce53..0000000
--- a/hw/xfree86/ramdac/xf86Cursor.c
+++ /dev/null
@@ -1,511 +0,0 @@
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86CursorPriv.h"
-#include "colormapst.h"
-#include "cursorstr.h"
-
-/* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for
- * MPX.
- * inputInfo is needed to pass the core pointer as the default argument into
- * the cursor functions.
- *
- * Externing inputInfo is not the nice way to do it but it works.
- */
-#include "inputstr.h"
-
-DevPrivateKeyRec xf86CursorScreenKeyRec;
-
-/* sprite functions */
-
-static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
-static Bool xf86CursorUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
-static void xf86CursorSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
-static void xf86CursorMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
-static Bool xf86DeviceCursorInitialize(DeviceIntPtr, ScreenPtr);
-static void xf86DeviceCursorCleanup(DeviceIntPtr, ScreenPtr);
-
-static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
-    xf86CursorRealizeCursor,
-    xf86CursorUnrealizeCursor,
-    xf86CursorSetCursor,
-    xf86CursorMoveCursor,
-    xf86DeviceCursorInitialize,
-    xf86DeviceCursorCleanup
-};
-
-/* Screen functions */
-
-static void xf86CursorInstallColormap(ColormapPtr);
-static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr,
-                                    Bool);
-static Bool xf86CursorCloseScreen(ScreenPtr);
-static void xf86CursorQueryBestSize(int, unsigned short *, unsigned short *,
-                                    ScreenPtr);
-
-/* ScrnInfoRec functions */
-
-static void xf86CursorEnableDisableFBAccess(ScrnInfoPtr, Bool);
-static Bool xf86CursorSwitchMode(ScrnInfoPtr, DisplayModePtr);
-
-Bool
-xf86InitCursor(ScreenPtr pScreen, xf86CursorInfoPtr infoPtr)
-{
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    xf86CursorScreenPtr ScreenPriv;
-    miPointerScreenPtr PointPriv;
-
-    if (!xf86InitHardwareCursor(pScreen, infoPtr))
-        return FALSE;
-
-    if (!dixRegisterPrivateKey(&xf86CursorScreenKeyRec, PRIVATE_SCREEN, 0))
-        return FALSE;
-
-    ScreenPriv = calloc(1, sizeof(xf86CursorScreenRec));
-    if (!ScreenPriv)
-        return FALSE;
-
-    dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, ScreenPriv);
-
-    ScreenPriv->SWCursor = TRUE;
-    ScreenPriv->isUp = FALSE;
-    ScreenPriv->CurrentCursor = NULL;
-    ScreenPriv->CursorInfoPtr = infoPtr;
-    ScreenPriv->PalettedCursor = FALSE;
-    ScreenPriv->pInstalledMap = NULL;
-
-    ScreenPriv->CloseScreen = pScreen->CloseScreen;
-    pScreen->CloseScreen = xf86CursorCloseScreen;
-    ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
-    pScreen->QueryBestSize = xf86CursorQueryBestSize;
-    ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
-    pScreen->RecolorCursor = xf86CursorRecolorCursor;
-
-    if ((infoPtr->pScrn->bitsPerPixel == 8) &&
-        !(infoPtr->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP)) {
-        ScreenPriv->InstallColormap = pScreen->InstallColormap;
-        pScreen->InstallColormap = xf86CursorInstallColormap;
-        ScreenPriv->PalettedCursor = TRUE;
-    }
-
-    PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
-
-    ScreenPriv->showTransparent = PointPriv->showTransparent;
-    if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT)
-        PointPriv->showTransparent = TRUE;
-    else
-        PointPriv->showTransparent = FALSE;
-    ScreenPriv->spriteFuncs = PointPriv->spriteFuncs;
-    PointPriv->spriteFuncs = &xf86CursorSpriteFuncs;
-
-    ScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
-    ScreenPriv->SwitchMode = pScrn->SwitchMode;
-
-    ScreenPriv->ForceHWCursorCount = 0;
-    ScreenPriv->HWCursorForced = FALSE;
-
-    pScrn->EnableDisableFBAccess = xf86CursorEnableDisableFBAccess;
-    if (pScrn->SwitchMode)
-        pScrn->SwitchMode = xf86CursorSwitchMode;
-
-    return TRUE;
-}
-
-/***** Screen functions *****/
-
-static Bool
-xf86CursorCloseScreen(ScreenPtr pScreen)
-{
-    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
-    miPointerScreenPtr PointPriv =
-        (miPointerScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                              miPointerScreenKey);
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (ScreenPriv->isUp && pScrn->vtSema)
-        xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
-
-    if (ScreenPriv->CurrentCursor)
-        FreeCursor(ScreenPriv->CurrentCursor, None);
-
-    pScreen->CloseScreen = ScreenPriv->CloseScreen;
-    pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
-    pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
-    if (ScreenPriv->InstallColormap)
-        pScreen->InstallColormap = ScreenPriv->InstallColormap;
-
-    PointPriv->spriteFuncs = ScreenPriv->spriteFuncs;
-    PointPriv->showTransparent = ScreenPriv->showTransparent;
-
-    pScrn->EnableDisableFBAccess = ScreenPriv->EnableDisableFBAccess;
-    pScrn->SwitchMode = ScreenPriv->SwitchMode;
-
-    free(ScreenPriv->transparentData);
-    free(ScreenPriv);
-
-    return (*pScreen->CloseScreen) (pScreen);
-}
-
-static void
-xf86CursorQueryBestSize(int class,
-                        unsigned short *width,
-                        unsigned short *height, ScreenPtr pScreen)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (class == CursorShape) {
-        if (*width > ScreenPriv->CursorInfoPtr->MaxWidth)
-            *width = ScreenPriv->CursorInfoPtr->MaxWidth;
-        if (*height > ScreenPriv->CursorInfoPtr->MaxHeight)
-            *height = ScreenPriv->CursorInfoPtr->MaxHeight;
-    }
-    else
-        (*ScreenPriv->QueryBestSize) (class, width, height, pScreen);
-}
-
-static void
-xf86CursorInstallColormap(ColormapPtr pMap)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pMap->pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    ScreenPriv->pInstalledMap = pMap;
-
-    (*ScreenPriv->InstallColormap) (pMap);
-}
-
-static void
-xf86CursorRecolorCursor(DeviceIntPtr pDev,
-                        ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (!displayed)
-        return;
-
-    if (ScreenPriv->SWCursor)
-        (*ScreenPriv->RecolorCursor) (pDev, pScreen, pCurs, displayed);
-    else
-        xf86RecolorCursor(pScreen, pCurs, displayed);
-}
-
-/***** ScrnInfoRec functions *********/
-
-static void
-xf86CursorEnableDisableFBAccess(ScrnInfoPtr pScrn, Bool enable)
-{
-    DeviceIntPtr pDev = inputInfo.pointer;
-
-    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (!enable && ScreenPriv->CurrentCursor != NullCursor) {
-        CursorPtr currentCursor = ScreenPriv->CurrentCursor;
-
-        xf86CursorSetCursor(pDev, pScreen, NullCursor, ScreenPriv->x,
-                            ScreenPriv->y);
-        ScreenPriv->isUp = FALSE;
-        ScreenPriv->SWCursor = TRUE;
-        ScreenPriv->SavedCursor = currentCursor;
-    }
-
-    if (ScreenPriv->EnableDisableFBAccess)
-        (*ScreenPriv->EnableDisableFBAccess) (pScrn, enable);
-
-    if (enable && ScreenPriv->SavedCursor) {
-        /*
-         * Re-set current cursor so drivers can react to FB access having been
-         * temporarily disabled.
-         */
-        xf86CursorSetCursor(pDev, pScreen, ScreenPriv->SavedCursor,
-                            ScreenPriv->x, ScreenPriv->y);
-        ScreenPriv->SavedCursor = NULL;
-    }
-}
-
-static Bool
-xf86CursorSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
-{
-    Bool ret;
-    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (ScreenPriv->isUp) {
-        xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
-        ScreenPriv->isUp = FALSE;
-    }
-
-    ret = (*ScreenPriv->SwitchMode) (pScrn, mode);
-
-    /*
-     * Cannot restore cursor here because the new frame[XY][01] haven't been
-     * calculated yet.  However, because the hardware cursor was removed above,
-     * ensure the cursor is repainted by miPointerWarpCursor().
-     */
-    ScreenPriv->CursorToRestore = ScreenPriv->CurrentCursor;
-    miPointerSetWaitForUpdate(pScreen, FALSE);  /* Force cursor repaint */
-
-    return ret;
-}
-
-/****** miPointerSpriteFunctions *******/
-
-static Bool
-xf86CursorRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (CursorRefCount(pCurs) <= 1)
-        dixSetScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen,
-                            NULL);
-
-    return (*ScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCurs);
-}
-
-static Bool
-xf86CursorUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (CursorRefCount(pCurs) <= 1) {
-        free(dixLookupScreenPrivate
-             (&pCurs->devPrivates, CursorScreenKey, pScreen));
-        dixSetScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen,
-                            NULL);
-    }
-
-    return (*ScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCurs);
-}
-
-static void
-xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
-                    int x, int y)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-    xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
-
-    if (pCurs == NullCursor) {  /* means we're supposed to remove the cursor */
-        if (ScreenPriv->SWCursor ||
-            !(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
-            (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, NullCursor, x,
-                                                   y);
-        else if (ScreenPriv->isUp) {
-            xf86SetCursor(pScreen, NullCursor, x, y);
-            ScreenPriv->isUp = FALSE;
-        }
-        if (ScreenPriv->CurrentCursor)
-            FreeCursor(ScreenPriv->CurrentCursor, None);
-        ScreenPriv->CurrentCursor = NullCursor;
-        return;
-    }
-
-    /* only update for VCP, otherwise we get cursor jumps when removing a
-       sprite. The second cursor is never HW rendered anyway. */
-    if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer) {
-        CursorPtr cursor = RefCursor(pCurs);
-        if (ScreenPriv->CurrentCursor)
-            FreeCursor(ScreenPriv->CurrentCursor, None);
-        ScreenPriv->CurrentCursor = cursor;
-        ScreenPriv->x = x;
-        ScreenPriv->y = y;
-        ScreenPriv->CursorToRestore = NULL;
-        ScreenPriv->HotX = cursor->bits->xhot;
-        ScreenPriv->HotY = cursor->bits->yhot;
-
-        if (!infoPtr->pScrn->vtSema) {
-            ScreenPriv->SavedCursor = cursor;
-            return;
-        }
-
-        if (infoPtr->pScrn->vtSema &&
-            (ScreenPriv->ForceHWCursorCount ||
-             xf86CheckHWCursor(pScreen, cursor, infoPtr))) {
-
-            if (ScreenPriv->SWCursor)   /* remove the SW cursor */
-                (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen,
-                                                       NullCursor, x, y);
-
-            if (xf86SetCursor(pScreen, cursor, x, y)) {
-                ScreenPriv->SWCursor = FALSE;
-                ScreenPriv->isUp = TRUE;
-
-                miPointerSetWaitForUpdate(pScreen, !infoPtr->pScrn->silkenMouse);
-                return;
-            }
-        }
-
-        miPointerSetWaitForUpdate(pScreen, TRUE);
-
-        if (ScreenPriv->isUp) {
-            /* Remove the HW cursor, or make it transparent */
-            if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
-                xf86SetTransparentCursor(pScreen);
-            }
-            else {
-                xf86SetCursor(pScreen, NullCursor, x, y);
-                ScreenPriv->isUp = FALSE;
-            }
-        }
-
-        if (!ScreenPriv->SWCursor)
-            ScreenPriv->SWCursor = TRUE;
-
-    }
-
-    if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
-        pCurs = NullCursor;
-
-    (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCurs, x, y);
-}
-
-/* Re-set the current cursor. This will switch between hardware and software
- * cursor depending on whether hardware cursor is currently supported
- * according to the driver.
- */
-void
-xf86CursorResetCursor(ScreenPtr pScreen)
-{
-    xf86CursorScreenPtr ScreenPriv;
-
-    if (!inputInfo.pointer)
-        return;
-
-    if (!dixPrivateKeyRegistered(xf86CursorScreenKey))
-        return;
-
-    ScreenPriv = (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                                        xf86CursorScreenKey);
-    if (!ScreenPriv)
-        return;
-
-    xf86CursorSetCursor(inputInfo.pointer, pScreen, ScreenPriv->CurrentCursor,
-                        ScreenPriv->x, ScreenPriv->y);
-}
-
-static void
-xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    /* only update coordinate state for first sprite, otherwise we get jumps
-       when removing a sprite. The second sprite is never HW rendered anyway */
-    if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer) {
-        ScreenPriv->x = x;
-        ScreenPriv->y = y;
-
-        if (ScreenPriv->CursorToRestore)
-            xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x,
-                                y);
-        else if (ScreenPriv->SWCursor)
-            (*ScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
-        else if (ScreenPriv->isUp)
-            xf86MoveCursor(pScreen, x, y);
-    }
-    else
-        (*ScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
-}
-
-void
-xf86ForceHWCursor(ScreenPtr pScreen, Bool on)
-{
-    DeviceIntPtr pDev = inputInfo.pointer;
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    if (on) {
-        if (ScreenPriv->ForceHWCursorCount++ == 0) {
-            if (ScreenPriv->SWCursor && ScreenPriv->CurrentCursor) {
-                ScreenPriv->HWCursorForced = TRUE;
-                xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CurrentCursor,
-                                    ScreenPriv->x, ScreenPriv->y);
-            }
-            else
-                ScreenPriv->HWCursorForced = FALSE;
-        }
-    }
-    else {
-        if (--ScreenPriv->ForceHWCursorCount == 0) {
-            if (ScreenPriv->HWCursorForced && ScreenPriv->CurrentCursor)
-                xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CurrentCursor,
-                                    ScreenPriv->x, ScreenPriv->y);
-        }
-    }
-}
-
-CursorPtr
-xf86CurrentCursor(ScreenPtr pScreen)
-{
-    xf86CursorScreenPtr ScreenPriv;
-
-    if (pScreen->is_output_slave)
-        pScreen = pScreen->current_master;
-
-    ScreenPriv = dixLookupPrivate(&pScreen->devPrivates, xf86CursorScreenKey);
-    return ScreenPriv->CurrentCursor;
-}
-
-xf86CursorInfoPtr
-xf86CreateCursorInfoRec(void)
-{
-    return calloc(1, sizeof(xf86CursorInfoRec));
-}
-
-void
-xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
-{
-    free(infoPtr);
-}
-
-/**
- * New cursor has been created. Do your initalizations here.
- */
-static Bool
-xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
-    int ret;
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    /* Init SW cursor */
-    ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize) (pDev, pScreen);
-
-    return ret;
-}
-
-/**
- * Cursor has been removed. Clean up after yourself.
- */
-static void
-xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
-{
-    xf86CursorScreenPtr ScreenPriv =
-        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
-                                               xf86CursorScreenKey);
-
-    /* Clean up SW cursor */
-    (*ScreenPriv->spriteFuncs->DeviceCursorCleanup) (pDev, pScreen);
-}
diff --git a/hw/xfree86/ramdac/xf86CursorRD.c b/hw/xfree86/ramdac/xf86CursorRD.c
new file mode 100644
index 0000000..afcce53
--- /dev/null
+++ b/hw/xfree86/ramdac/xf86CursorRD.c
@@ -0,0 +1,511 @@
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86CursorPriv.h"
+#include "colormapst.h"
+#include "cursorstr.h"
+
+/* FIXME: This was added with the ABI change of the miPointerSpriteFuncs for
+ * MPX.
+ * inputInfo is needed to pass the core pointer as the default argument into
+ * the cursor functions.
+ *
+ * Externing inputInfo is not the nice way to do it but it works.
+ */
+#include "inputstr.h"
+
+DevPrivateKeyRec xf86CursorScreenKeyRec;
+
+/* sprite functions */
+
+static Bool xf86CursorRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
+static Bool xf86CursorUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
+static void xf86CursorSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
+static void xf86CursorMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
+static Bool xf86DeviceCursorInitialize(DeviceIntPtr, ScreenPtr);
+static void xf86DeviceCursorCleanup(DeviceIntPtr, ScreenPtr);
+
+static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
+    xf86CursorRealizeCursor,
+    xf86CursorUnrealizeCursor,
+    xf86CursorSetCursor,
+    xf86CursorMoveCursor,
+    xf86DeviceCursorInitialize,
+    xf86DeviceCursorCleanup
+};
+
+/* Screen functions */
+
+static void xf86CursorInstallColormap(ColormapPtr);
+static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr,
+                                    Bool);
+static Bool xf86CursorCloseScreen(ScreenPtr);
+static void xf86CursorQueryBestSize(int, unsigned short *, unsigned short *,
+                                    ScreenPtr);
+
+/* ScrnInfoRec functions */
+
+static void xf86CursorEnableDisableFBAccess(ScrnInfoPtr, Bool);
+static Bool xf86CursorSwitchMode(ScrnInfoPtr, DisplayModePtr);
+
+Bool
+xf86InitCursor(ScreenPtr pScreen, xf86CursorInfoPtr infoPtr)
+{
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    xf86CursorScreenPtr ScreenPriv;
+    miPointerScreenPtr PointPriv;
+
+    if (!xf86InitHardwareCursor(pScreen, infoPtr))
+        return FALSE;
+
+    if (!dixRegisterPrivateKey(&xf86CursorScreenKeyRec, PRIVATE_SCREEN, 0))
+        return FALSE;
+
+    ScreenPriv = calloc(1, sizeof(xf86CursorScreenRec));
+    if (!ScreenPriv)
+        return FALSE;
+
+    dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, ScreenPriv);
+
+    ScreenPriv->SWCursor = TRUE;
+    ScreenPriv->isUp = FALSE;
+    ScreenPriv->CurrentCursor = NULL;
+    ScreenPriv->CursorInfoPtr = infoPtr;
+    ScreenPriv->PalettedCursor = FALSE;
+    ScreenPriv->pInstalledMap = NULL;
+
+    ScreenPriv->CloseScreen = pScreen->CloseScreen;
+    pScreen->CloseScreen = xf86CursorCloseScreen;
+    ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
+    pScreen->QueryBestSize = xf86CursorQueryBestSize;
+    ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
+    pScreen->RecolorCursor = xf86CursorRecolorCursor;
+
+    if ((infoPtr->pScrn->bitsPerPixel == 8) &&
+        !(infoPtr->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP)) {
+        ScreenPriv->InstallColormap = pScreen->InstallColormap;
+        pScreen->InstallColormap = xf86CursorInstallColormap;
+        ScreenPriv->PalettedCursor = TRUE;
+    }
+
+    PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
+
+    ScreenPriv->showTransparent = PointPriv->showTransparent;
+    if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT)
+        PointPriv->showTransparent = TRUE;
+    else
+        PointPriv->showTransparent = FALSE;
+    ScreenPriv->spriteFuncs = PointPriv->spriteFuncs;
+    PointPriv->spriteFuncs = &xf86CursorSpriteFuncs;
+
+    ScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
+    ScreenPriv->SwitchMode = pScrn->SwitchMode;
+
+    ScreenPriv->ForceHWCursorCount = 0;
+    ScreenPriv->HWCursorForced = FALSE;
+
+    pScrn->EnableDisableFBAccess = xf86CursorEnableDisableFBAccess;
+    if (pScrn->SwitchMode)
+        pScrn->SwitchMode = xf86CursorSwitchMode;
+
+    return TRUE;
+}
+
+/***** Screen functions *****/
+
+static Bool
+xf86CursorCloseScreen(ScreenPtr pScreen)
+{
+    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    miPointerScreenPtr PointPriv =
+        (miPointerScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                              miPointerScreenKey);
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (ScreenPriv->isUp && pScrn->vtSema)
+        xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
+
+    if (ScreenPriv->CurrentCursor)
+        FreeCursor(ScreenPriv->CurrentCursor, None);
+
+    pScreen->CloseScreen = ScreenPriv->CloseScreen;
+    pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
+    pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
+    if (ScreenPriv->InstallColormap)
+        pScreen->InstallColormap = ScreenPriv->InstallColormap;
+
+    PointPriv->spriteFuncs = ScreenPriv->spriteFuncs;
+    PointPriv->showTransparent = ScreenPriv->showTransparent;
+
+    pScrn->EnableDisableFBAccess = ScreenPriv->EnableDisableFBAccess;
+    pScrn->SwitchMode = ScreenPriv->SwitchMode;
+
+    free(ScreenPriv->transparentData);
+    free(ScreenPriv);
+
+    return (*pScreen->CloseScreen) (pScreen);
+}
+
+static void
+xf86CursorQueryBestSize(int class,
+                        unsigned short *width,
+                        unsigned short *height, ScreenPtr pScreen)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (class == CursorShape) {
+        if (*width > ScreenPriv->CursorInfoPtr->MaxWidth)
+            *width = ScreenPriv->CursorInfoPtr->MaxWidth;
+        if (*height > ScreenPriv->CursorInfoPtr->MaxHeight)
+            *height = ScreenPriv->CursorInfoPtr->MaxHeight;
+    }
+    else
+        (*ScreenPriv->QueryBestSize) (class, width, height, pScreen);
+}
+
+static void
+xf86CursorInstallColormap(ColormapPtr pMap)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pMap->pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    ScreenPriv->pInstalledMap = pMap;
+
+    (*ScreenPriv->InstallColormap) (pMap);
+}
+
+static void
+xf86CursorRecolorCursor(DeviceIntPtr pDev,
+                        ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (!displayed)
+        return;
+
+    if (ScreenPriv->SWCursor)
+        (*ScreenPriv->RecolorCursor) (pDev, pScreen, pCurs, displayed);
+    else
+        xf86RecolorCursor(pScreen, pCurs, displayed);
+}
+
+/***** ScrnInfoRec functions *********/
+
+static void
+xf86CursorEnableDisableFBAccess(ScrnInfoPtr pScrn, Bool enable)
+{
+    DeviceIntPtr pDev = inputInfo.pointer;
+
+    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (!enable && ScreenPriv->CurrentCursor != NullCursor) {
+        CursorPtr currentCursor = ScreenPriv->CurrentCursor;
+
+        xf86CursorSetCursor(pDev, pScreen, NullCursor, ScreenPriv->x,
+                            ScreenPriv->y);
+        ScreenPriv->isUp = FALSE;
+        ScreenPriv->SWCursor = TRUE;
+        ScreenPriv->SavedCursor = currentCursor;
+    }
+
+    if (ScreenPriv->EnableDisableFBAccess)
+        (*ScreenPriv->EnableDisableFBAccess) (pScrn, enable);
+
+    if (enable && ScreenPriv->SavedCursor) {
+        /*
+         * Re-set current cursor so drivers can react to FB access having been
+         * temporarily disabled.
+         */
+        xf86CursorSetCursor(pDev, pScreen, ScreenPriv->SavedCursor,
+                            ScreenPriv->x, ScreenPriv->y);
+        ScreenPriv->SavedCursor = NULL;
+    }
+}
+
+static Bool
+xf86CursorSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
+{
+    Bool ret;
+    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (ScreenPriv->isUp) {
+        xf86SetCursor(pScreen, NullCursor, ScreenPriv->x, ScreenPriv->y);
+        ScreenPriv->isUp = FALSE;
+    }
+
+    ret = (*ScreenPriv->SwitchMode) (pScrn, mode);
+
+    /*
+     * Cannot restore cursor here because the new frame[XY][01] haven't been
+     * calculated yet.  However, because the hardware cursor was removed above,
+     * ensure the cursor is repainted by miPointerWarpCursor().
+     */
+    ScreenPriv->CursorToRestore = ScreenPriv->CurrentCursor;
+    miPointerSetWaitForUpdate(pScreen, FALSE);  /* Force cursor repaint */
+
+    return ret;
+}
+
+/****** miPointerSpriteFunctions *******/
+
+static Bool
+xf86CursorRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (CursorRefCount(pCurs) <= 1)
+        dixSetScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen,
+                            NULL);
+
+    return (*ScreenPriv->spriteFuncs->RealizeCursor) (pDev, pScreen, pCurs);
+}
+
+static Bool
+xf86CursorUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (CursorRefCount(pCurs) <= 1) {
+        free(dixLookupScreenPrivate
+             (&pCurs->devPrivates, CursorScreenKey, pScreen));
+        dixSetScreenPrivate(&pCurs->devPrivates, CursorScreenKey, pScreen,
+                            NULL);
+    }
+
+    return (*ScreenPriv->spriteFuncs->UnrealizeCursor) (pDev, pScreen, pCurs);
+}
+
+static void
+xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
+                    int x, int y)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+    xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
+
+    if (pCurs == NullCursor) {  /* means we're supposed to remove the cursor */
+        if (ScreenPriv->SWCursor ||
+            !(GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer))
+            (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, NullCursor, x,
+                                                   y);
+        else if (ScreenPriv->isUp) {
+            xf86SetCursor(pScreen, NullCursor, x, y);
+            ScreenPriv->isUp = FALSE;
+        }
+        if (ScreenPriv->CurrentCursor)
+            FreeCursor(ScreenPriv->CurrentCursor, None);
+        ScreenPriv->CurrentCursor = NullCursor;
+        return;
+    }
+
+    /* only update for VCP, otherwise we get cursor jumps when removing a
+       sprite. The second cursor is never HW rendered anyway. */
+    if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer) {
+        CursorPtr cursor = RefCursor(pCurs);
+        if (ScreenPriv->CurrentCursor)
+            FreeCursor(ScreenPriv->CurrentCursor, None);
+        ScreenPriv->CurrentCursor = cursor;
+        ScreenPriv->x = x;
+        ScreenPriv->y = y;
+        ScreenPriv->CursorToRestore = NULL;
+        ScreenPriv->HotX = cursor->bits->xhot;
+        ScreenPriv->HotY = cursor->bits->yhot;
+
+        if (!infoPtr->pScrn->vtSema) {
+            ScreenPriv->SavedCursor = cursor;
+            return;
+        }
+
+        if (infoPtr->pScrn->vtSema &&
+            (ScreenPriv->ForceHWCursorCount ||
+             xf86CheckHWCursor(pScreen, cursor, infoPtr))) {
+
+            if (ScreenPriv->SWCursor)   /* remove the SW cursor */
+                (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen,
+                                                       NullCursor, x, y);
+
+            if (xf86SetCursor(pScreen, cursor, x, y)) {
+                ScreenPriv->SWCursor = FALSE;
+                ScreenPriv->isUp = TRUE;
+
+                miPointerSetWaitForUpdate(pScreen, !infoPtr->pScrn->silkenMouse);
+                return;
+            }
+        }
+
+        miPointerSetWaitForUpdate(pScreen, TRUE);
+
+        if (ScreenPriv->isUp) {
+            /* Remove the HW cursor, or make it transparent */
+            if (infoPtr->Flags & HARDWARE_CURSOR_SHOW_TRANSPARENT) {
+                xf86SetTransparentCursor(pScreen);
+            }
+            else {
+                xf86SetCursor(pScreen, NullCursor, x, y);
+                ScreenPriv->isUp = FALSE;
+            }
+        }
+
+        if (!ScreenPriv->SWCursor)
+            ScreenPriv->SWCursor = TRUE;
+
+    }
+
+    if (pCurs->bits->emptyMask && !ScreenPriv->showTransparent)
+        pCurs = NullCursor;
+
+    (*ScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCurs, x, y);
+}
+
+/* Re-set the current cursor. This will switch between hardware and software
+ * cursor depending on whether hardware cursor is currently supported
+ * according to the driver.
+ */
+void
+xf86CursorResetCursor(ScreenPtr pScreen)
+{
+    xf86CursorScreenPtr ScreenPriv;
+
+    if (!inputInfo.pointer)
+        return;
+
+    if (!dixPrivateKeyRegistered(xf86CursorScreenKey))
+        return;
+
+    ScreenPriv = (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                                        xf86CursorScreenKey);
+    if (!ScreenPriv)
+        return;
+
+    xf86CursorSetCursor(inputInfo.pointer, pScreen, ScreenPriv->CurrentCursor,
+                        ScreenPriv->x, ScreenPriv->y);
+}
+
+static void
+xf86CursorMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    /* only update coordinate state for first sprite, otherwise we get jumps
+       when removing a sprite. The second sprite is never HW rendered anyway */
+    if (GetMaster(pDev, MASTER_POINTER) == inputInfo.pointer) {
+        ScreenPriv->x = x;
+        ScreenPriv->y = y;
+
+        if (ScreenPriv->CursorToRestore)
+            xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CursorToRestore, x,
+                                y);
+        else if (ScreenPriv->SWCursor)
+            (*ScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+        else if (ScreenPriv->isUp)
+            xf86MoveCursor(pScreen, x, y);
+    }
+    else
+        (*ScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y);
+}
+
+void
+xf86ForceHWCursor(ScreenPtr pScreen, Bool on)
+{
+    DeviceIntPtr pDev = inputInfo.pointer;
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    if (on) {
+        if (ScreenPriv->ForceHWCursorCount++ == 0) {
+            if (ScreenPriv->SWCursor && ScreenPriv->CurrentCursor) {
+                ScreenPriv->HWCursorForced = TRUE;
+                xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CurrentCursor,
+                                    ScreenPriv->x, ScreenPriv->y);
+            }
+            else
+                ScreenPriv->HWCursorForced = FALSE;
+        }
+    }
+    else {
+        if (--ScreenPriv->ForceHWCursorCount == 0) {
+            if (ScreenPriv->HWCursorForced && ScreenPriv->CurrentCursor)
+                xf86CursorSetCursor(pDev, pScreen, ScreenPriv->CurrentCursor,
+                                    ScreenPriv->x, ScreenPriv->y);
+        }
+    }
+}
+
+CursorPtr
+xf86CurrentCursor(ScreenPtr pScreen)
+{
+    xf86CursorScreenPtr ScreenPriv;
+
+    if (pScreen->is_output_slave)
+        pScreen = pScreen->current_master;
+
+    ScreenPriv = dixLookupPrivate(&pScreen->devPrivates, xf86CursorScreenKey);
+    return ScreenPriv->CurrentCursor;
+}
+
+xf86CursorInfoPtr
+xf86CreateCursorInfoRec(void)
+{
+    return calloc(1, sizeof(xf86CursorInfoRec));
+}
+
+void
+xf86DestroyCursorInfoRec(xf86CursorInfoPtr infoPtr)
+{
+    free(infoPtr);
+}
+
+/**
+ * New cursor has been created. Do your initalizations here.
+ */
+static Bool
+xf86DeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+    int ret;
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    /* Init SW cursor */
+    ret = (*ScreenPriv->spriteFuncs->DeviceCursorInitialize) (pDev, pScreen);
+
+    return ret;
+}
+
+/**
+ * Cursor has been removed. Clean up after yourself.
+ */
+static void
+xf86DeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
+{
+    xf86CursorScreenPtr ScreenPriv =
+        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
+                                               xf86CursorScreenKey);
+
+    /* Clean up SW cursor */
+    (*ScreenPriv->spriteFuncs->DeviceCursorCleanup) (pDev, pScreen);
+}
diff --git a/test/Makefile.am b/test/Makefile.am
index 064e1c5..bbf6691 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -57,6 +57,8 @@ if SPECIAL_DTRACE_OBJECTS
 TEST_LDADD += $(OS_LIB) $(DIX_LIB)
 endif
 
+xkb_SOURCES = test_xkb.c
+
 xkb_LDADD=$(TEST_LDADD)
 input_LDADD=$(TEST_LDADD)
 xtest_LDADD=$(TEST_LDADD)
@@ -99,10 +101,6 @@ if DRI2
 libxservertest_la_LIBADD += $(top_builddir)/hw/xfree86/dri2/libdri2.la
 endif
 
-if DRI3
-libxservertest_la_LIBADD += $(top_builddir)/dri3/libdri3.la
-endif
-
 else
 nodist_libxservertest_la_SOURCES = \
             ddxstubs.c \
diff --git a/test/test_xkb.c b/test/test_xkb.c
new file mode 100644
index 0000000..9047f59
--- /dev/null
+++ b/test/test_xkb.c
@@ -0,0 +1,174 @@
+/**
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice (including the next
+ *  paragraph) shall be included in all copies or substantial portions of the
+ *  Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ *  DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <xkb-config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/keysym.h>
+#include <X11/Xatom.h>
+#include "misc.h"
+#include "inputstr.h"
+#include "opaque.h"
+#include "property.h"
+#define	XKBSRV_NEED_FILE_FUNCS
+#include <xkbsrv.h>
+#include "../xkb/xkbgeom.h"
+#include <X11/extensions/XKMformat.h>
+#include "xkbfile.h"
+#include "../xkb/xkb.h"
+#include <assert.h>
+
+/**
+ * Initialize an empty XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ *
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void
+xkb_get_rules_test(void)
+{
+    XkbRMLVOSet rmlvo = { NULL };
+    XkbGetRulesDflts(&rmlvo);
+
+    assert(rmlvo.rules);
+    assert(rmlvo.model);
+    assert(rmlvo.layout);
+    assert(rmlvo.variant);
+    assert(rmlvo.options);
+    assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
+    assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
+    assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
+    assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
+    assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
+}
+
+/**
+ * Initialize an random XkbRMLVOSet.
+ * Call XkbGetRulesDflts to obtain the default ruleset.
+ * Compare obtained ruleset with the built-in defaults.
+ * Result: RMLVO defaults are the same as obtained.
+ */
+static void
+xkb_set_rules_test(void)
+{
+    XkbRMLVOSet rmlvo;
+    XkbRMLVOSet rmlvo_new = { NULL };
+
+    XkbInitRules(&rmlvo, "test-rules", "test-model", "test-layout",
+                         "test-variant", "test-options");
+    assert(rmlvo.rules);
+    assert(rmlvo.model);
+    assert(rmlvo.layout);
+    assert(rmlvo.variant);
+    assert(rmlvo.options);
+
+    XkbSetRulesDflts(&rmlvo);
+    XkbGetRulesDflts(&rmlvo_new);
+
+    /* XkbGetRulesDflts strdups the values */
+    assert(rmlvo.rules != rmlvo_new.rules);
+    assert(rmlvo.model != rmlvo_new.model);
+    assert(rmlvo.layout != rmlvo_new.layout);
+    assert(rmlvo.variant != rmlvo_new.variant);
+    assert(rmlvo.options != rmlvo_new.options);
+
+    assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
+    assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
+    assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
+    assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
+    assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
+
+    XkbFreeRMLVOSet(&rmlvo, FALSE);
+}
+
+/**
+ * Get the default RMLVO set.
+ * Set the default RMLVO set.
+ * Get the default RMLVO set.
+ * Repeat the last two steps.
+ *
+ * Result: RMLVO set obtained is the same as previously set.
+ */
+static void
+xkb_set_get_rules_test(void)
+{
+/* This test failed before XkbGetRulesDftlts changed to strdup.
+   We test this twice because the first time using XkbGetRulesDflts we obtain
+   the built-in defaults. The unexpected free isn't triggered until the second
+   XkbSetRulesDefaults.
+ */
+    XkbRMLVOSet rmlvo = { NULL };
+    XkbRMLVOSet rmlvo_backup;
+
+    XkbGetRulesDflts(&rmlvo);
+
+    /* pass 1 */
+    XkbSetRulesDflts(&rmlvo);
+    XkbGetRulesDflts(&rmlvo);
+
+    /* Make a backup copy */
+    rmlvo_backup.rules = strdup(rmlvo.rules);
+    rmlvo_backup.layout = strdup(rmlvo.layout);
+    rmlvo_backup.model = strdup(rmlvo.model);
+    rmlvo_backup.variant = strdup(rmlvo.variant);
+    rmlvo_backup.options = strdup(rmlvo.options);
+
+    /* pass 2 */
+    XkbSetRulesDflts(&rmlvo);
+
+    /* This test is iffy, because strictly we may be comparing against already
+     * freed memory */
+    assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+    assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+    assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+    assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+    assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+
+    XkbGetRulesDflts(&rmlvo);
+    assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
+    assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
+    assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
+    assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
+    assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
+}
+
+int
+main(int argc, char **argv)
+{
+    xkb_set_get_rules_test();
+    xkb_get_rules_test();
+    xkb_set_rules_test();
+
+    return 0;
+}
diff --git a/test/xkb.c b/test/xkb.c
deleted file mode 100644
index 9047f59..0000000
--- a/test/xkb.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * Copyright © 2009 Red Hat, Inc.
- *
- *  Permission is hereby granted, free of charge, to any person obtaining a
- *  copy of this software and associated documentation files (the "Software"),
- *  to deal in the Software without restriction, including without limitation
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *  and/or sell copies of the Software, and to permit persons to whom the
- *  Software is furnished to do so, subject to the following conditions:
- *
- *  The above copyright notice and this permission notice (including the next
- *  paragraph) shall be included in all copies or substantial portions of the
- *  Software.
- *
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *  DEALINGS IN THE SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <xkb-config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include <X11/Xatom.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "opaque.h"
-#include "property.h"
-#define	XKBSRV_NEED_FILE_FUNCS
-#include <xkbsrv.h>
-#include "../xkb/xkbgeom.h"
-#include <X11/extensions/XKMformat.h>
-#include "xkbfile.h"
-#include "../xkb/xkb.h"
-#include <assert.h>
-
-/**
- * Initialize an empty XkbRMLVOSet.
- * Call XkbGetRulesDflts to obtain the default ruleset.
- * Compare obtained ruleset with the built-in defaults.
- *
- * Result: RMLVO defaults are the same as obtained.
- */
-static void
-xkb_get_rules_test(void)
-{
-    XkbRMLVOSet rmlvo = { NULL };
-    XkbGetRulesDflts(&rmlvo);
-
-    assert(rmlvo.rules);
-    assert(rmlvo.model);
-    assert(rmlvo.layout);
-    assert(rmlvo.variant);
-    assert(rmlvo.options);
-    assert(strcmp(rmlvo.rules, XKB_DFLT_RULES) == 0);
-    assert(strcmp(rmlvo.model, XKB_DFLT_MODEL) == 0);
-    assert(strcmp(rmlvo.layout, XKB_DFLT_LAYOUT) == 0);
-    assert(strcmp(rmlvo.variant, XKB_DFLT_VARIANT) == 0);
-    assert(strcmp(rmlvo.options, XKB_DFLT_OPTIONS) == 0);
-}
-
-/**
- * Initialize an random XkbRMLVOSet.
- * Call XkbGetRulesDflts to obtain the default ruleset.
- * Compare obtained ruleset with the built-in defaults.
- * Result: RMLVO defaults are the same as obtained.
- */
-static void
-xkb_set_rules_test(void)
-{
-    XkbRMLVOSet rmlvo;
-    XkbRMLVOSet rmlvo_new = { NULL };
-
-    XkbInitRules(&rmlvo, "test-rules", "test-model", "test-layout",
-                         "test-variant", "test-options");
-    assert(rmlvo.rules);
-    assert(rmlvo.model);
-    assert(rmlvo.layout);
-    assert(rmlvo.variant);
-    assert(rmlvo.options);
-
-    XkbSetRulesDflts(&rmlvo);
-    XkbGetRulesDflts(&rmlvo_new);
-
-    /* XkbGetRulesDflts strdups the values */
-    assert(rmlvo.rules != rmlvo_new.rules);
-    assert(rmlvo.model != rmlvo_new.model);
-    assert(rmlvo.layout != rmlvo_new.layout);
-    assert(rmlvo.variant != rmlvo_new.variant);
-    assert(rmlvo.options != rmlvo_new.options);
-
-    assert(strcmp(rmlvo.rules, rmlvo_new.rules) == 0);
-    assert(strcmp(rmlvo.model, rmlvo_new.model) == 0);
-    assert(strcmp(rmlvo.layout, rmlvo_new.layout) == 0);
-    assert(strcmp(rmlvo.variant, rmlvo_new.variant) == 0);
-    assert(strcmp(rmlvo.options, rmlvo_new.options) == 0);
-
-    XkbFreeRMLVOSet(&rmlvo, FALSE);
-}
-
-/**
- * Get the default RMLVO set.
- * Set the default RMLVO set.
- * Get the default RMLVO set.
- * Repeat the last two steps.
- *
- * Result: RMLVO set obtained is the same as previously set.
- */
-static void
-xkb_set_get_rules_test(void)
-{
-/* This test failed before XkbGetRulesDftlts changed to strdup.
-   We test this twice because the first time using XkbGetRulesDflts we obtain
-   the built-in defaults. The unexpected free isn't triggered until the second
-   XkbSetRulesDefaults.
- */
-    XkbRMLVOSet rmlvo = { NULL };
-    XkbRMLVOSet rmlvo_backup;
-
-    XkbGetRulesDflts(&rmlvo);
-
-    /* pass 1 */
-    XkbSetRulesDflts(&rmlvo);
-    XkbGetRulesDflts(&rmlvo);
-
-    /* Make a backup copy */
-    rmlvo_backup.rules = strdup(rmlvo.rules);
-    rmlvo_backup.layout = strdup(rmlvo.layout);
-    rmlvo_backup.model = strdup(rmlvo.model);
-    rmlvo_backup.variant = strdup(rmlvo.variant);
-    rmlvo_backup.options = strdup(rmlvo.options);
-
-    /* pass 2 */
-    XkbSetRulesDflts(&rmlvo);
-
-    /* This test is iffy, because strictly we may be comparing against already
-     * freed memory */
-    assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
-    assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
-    assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
-    assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
-    assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
-
-    XkbGetRulesDflts(&rmlvo);
-    assert(strcmp(rmlvo.rules, rmlvo_backup.rules) == 0);
-    assert(strcmp(rmlvo.model, rmlvo_backup.model) == 0);
-    assert(strcmp(rmlvo.layout, rmlvo_backup.layout) == 0);
-    assert(strcmp(rmlvo.variant, rmlvo_backup.variant) == 0);
-    assert(strcmp(rmlvo.options, rmlvo_backup.options) == 0);
-}
-
-int
-main(int argc, char **argv)
-{
-    xkb_set_get_rules_test();
-    xkb_get_rules_test();
-    xkb_set_rules_test();
-
-    return 0;
-}


More information about the xorg-commit mailing list