From 7ddd7405fd1097967e25ae63f62a95ab64d4f873 Mon Sep 17 00:00:00 2001
From: James Meyer <james.meyer@operamail.com>
Date: Fri, 7 Dec 2012 09:02:38 -0600
Subject: xorg-server: 1.3.0 This is one doesn't use the pixman cache.
 __changelog can be removed when pixman cache bug if fixed

---
 ...001-dix-fix-zaphod-screen-scrossing-54654.patch |  42 ++
 abs/core/xorg-server/PKGBUILD                      |  34 +-
 abs/core/xorg-server/__changelog                   |   2 +
 abs/core/xorg-server/git-fixes.patch               | 643 ---------------------
 abs/core/xorg-server/use-pixman-glyph-cache.patch  | 270 ---------
 5 files changed, 58 insertions(+), 933 deletions(-)
 create mode 100644 abs/core/xorg-server/0001-dix-fix-zaphod-screen-scrossing-54654.patch
 create mode 100644 abs/core/xorg-server/__changelog
 delete mode 100644 abs/core/xorg-server/git-fixes.patch
 delete mode 100644 abs/core/xorg-server/use-pixman-glyph-cache.patch

diff --git a/abs/core/xorg-server/0001-dix-fix-zaphod-screen-scrossing-54654.patch b/abs/core/xorg-server/0001-dix-fix-zaphod-screen-scrossing-54654.patch
new file mode 100644
index 0000000..e3e42d4
--- /dev/null
+++ b/abs/core/xorg-server/0001-dix-fix-zaphod-screen-scrossing-54654.patch
@@ -0,0 +1,42 @@
+From 29d84d5a7ca4cc12cce47de9313adeb8554fb894 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Thu, 18 Oct 2012 15:11:31 +1000
+Subject: [PATCH] dix: fix zaphod screen scrossing (#54654)
+
+POINTER_SCREEN coordinates are screen-relative. For a Zaphod setup, the
+coordinates after a screen crossing are already relative to the new screen's
+origin. Add that offset to the coordinates before re-setting.
+
+regression introduced by
+commit bafbd99080be49a17be97d2cc758fbe623369945
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Aug 8 11:34:32 2012 +1000
+
+    dix: work around scaling issues during WarpPointer (#53037)
+
+X.Org Bug 54654 <http://bugs.freedesktop.org/show_bug.cgi?id=54654>
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ dix/getevents.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/dix/getevents.c b/dix/getevents.c
+index 71d83c4..8b4379d 100644
+--- a/dix/getevents.c
++++ b/dix/getevents.c
+@@ -1400,8 +1400,9 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
+        coordinates were.
+      */
+     if (flags & POINTER_SCREEN) {
+-        screenx = sx;
+-        screeny = sy;
++        scr = miPointerGetScreen(pDev);
++        screenx = sx + scr->x;
++        screeny = sy + scr->y;
+     }
+ 
+     scr = positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
+-- 
+1.7.11.7
+
diff --git a/abs/core/xorg-server/PKGBUILD b/abs/core/xorg-server/PKGBUILD
index c42748b..3b6fee0 100644
--- a/abs/core/xorg-server/PKGBUILD
+++ b/abs/core/xorg-server/PKGBUILD
@@ -1,10 +1,10 @@
-# $Id: PKGBUILD 171979 2012-11-25 17:50:59Z andyrtr $
+# $Id: PKGBUILD 169327 2012-10-19 14:00:03Z andyrtr $
 # Maintainer: Jan de Groot <jgc@archlinux.org>
 
 pkgbase=xorg-server
 pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb' 'xorg-server-xnest' 'xorg-server-common' 'xorg-server-devel')
-pkgver=1.13.0.901
-pkgrel=1
+pkgver=1.13.0
+pkgrel=3
 arch=('i686' 'x86_64')
 license=('custom')
 url="http://xorg.freedesktop.org"
@@ -19,31 +19,27 @@ source=(${url}/releases/individual/xserver/${pkgbase}-${pkgver}.tar.bz2
         xvfb-run
         xvfb-run.1
         10-quirks.conf
-        #git-fixes.patch
-        use-pixman-glyph-cache.patch)
-sha256sums=('64a50d6ca8264d8e32db4ebeeaf4df3b37ef447c7eef37e9a377c983733596f5'
+        0001-dix-fix-zaphod-screen-scrossing-54654.patch)
+sha256sums=('548b91cb01087ad4f892428e7ac4955251cf12393e86c70420436b33848ef28a'
             '66e25f76a7496c429e0aff4b0670f168719bb0ceaeb88c6f2272f2bf3ed21162'
             'd027776fac1f7675b0a9ee817502290b1c45f9c09b0f0a6bb058c35f92361e84'
             'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9'
             '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776'
             '94612f5c0d34a3b7152915c2e285c7b462e9d8e38d3539bd551a339498eac166'
-            '7c1dacd30c46b01424c7c75974285cd348dafd0327eb3f211cbe446ad90dd308')
+            '23861814b4283ca3fe43aae6e88ee82bcbae5713bf88eabeaef7beb94efe9707')
 
 build() {
   cd "${srcdir}/${pkgbase}-${pkgver}"
 
-  # Apply upstream fixes from server-1.13 branch
-#  patch -Np1 -i "${srcdir}/git-fixes.patch"
-
-  # Use pixman 0.28.0 glyph cache - backported from git master
-  patch -Np1 -i "${srcdir}/use-pixman-glyph-cache.patch"
-
   # Use nouveau/nv/nvidia drivers for nvidia devices
   patch -Np1 -i "${srcdir}/autoconfig-nvidia.patch"
 
   # Use unofficial imedia SiS driver for supported SiS devices
   patch -Np0 -i "${srcdir}/autoconfig-sis.patch"
 
+  # https://bugs.archlinux.org/task/31959 / https://bugs.freedesktop.org/show_bug.cgi?id=54654
+  patch -Np1 -i ${srcdir}/0001-dix-fix-zaphod-screen-scrossing-54654.patch
+
   autoreconf -fi
   ./configure --prefix=/usr \
       --enable-ipv6 \
@@ -101,7 +97,7 @@ package_xorg-server-common() {
 
 package_xorg-server() {
   pkgdesc="Xorg X server"
-  depends=(libxdmcp libxfont libpciaccess libdrm 'pixman>=0.28.0' libgcrypt libxau xorg-server-common xf86-input-evdev)
+  depends=(libxdmcp libxfont libpciaccess libdrm pixman libgcrypt libxau xorg-server-common xf86-input-evdev)
   backup=('etc/X11/xorg.conf.d/10-evdev.conf' 'etc/X11/xorg.conf.d/10-quirks.conf')
   # see xorg-server-1.13.0/hw/xfree86/common/xf86Module.h for ABI versions - we provide major numbers that drivers can depend on
   provides=('X-ABI-VIDEODRV_VERSION=13' 'X-ABI-XINPUT_VERSION=18' 'X-ABI-EXTENSION_VERSION=7.0' 'x-server')
@@ -136,7 +132,7 @@ package_xorg-server() {
 
 package_xorg-server-xephyr() {
   pkgdesc="A nested X server that runs as an X application"
-  depends=(libxfont libgl libgcrypt libxv 'pixman>=0.28.0' xorg-server-common)
+  depends=(libxfont libgl libgcrypt libxv pixman xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/kdrive"
   make DESTDIR="${pkgdir}" install
@@ -147,7 +143,7 @@ package_xorg-server-xephyr() {
 
 package_xorg-server-xvfb() {
   pkgdesc="Virtual framebuffer X server"
-  depends=(libxfont libxdmcp libxau libgcrypt 'pixman>=0.28.0' xorg-server-common)
+  depends=(libxfont libxdmcp libxau libgcrypt pixman xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/vfb"
   make DESTDIR="${pkgdir}" install
@@ -161,7 +157,7 @@ package_xorg-server-xvfb() {
 
 package_xorg-server-xnest() {
   pkgdesc="A nested X server that runs as an X application"
-  depends=(libxfont libxext libgcrypt 'pixman>=0.28.0' xorg-server-common)
+  depends=(libxfont libxext libgcrypt pixman xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/xnest"
   make DESTDIR="${pkgdir}" install
@@ -172,7 +168,7 @@ package_xorg-server-xnest() {
 
 package_xorg-server-xdmx() {
   pkgdesc="Distributed Multihead X Server and utilities"
-  depends=(libxfont libxi libgcrypt libxaw libxrender libdmx libxfixes 'pixman>=0.28.0' xorg-server-common)
+  depends=(libxfont libxi libgcrypt libxaw libxrender libdmx libxfixes pixman xorg-server-common)
 
   cd "${srcdir}/${pkgbase}-${pkgver}/hw/dmx"
   make DESTDIR="${pkgdir}" install
@@ -187,8 +183,6 @@ package_xorg-server-devel() {
            xproto randrproto renderproto xextproto inputproto kbproto 
            fontsproto pixman videoproto xf86driproto glproto 
            mesa dri2proto xineramaproto libpciaccess
-           # see FS#32146
-           resourceproto scrnsaverproto
            # not technically required but almost every Xorg pkg needs it to build
            xorg-util-macros)
 
diff --git a/abs/core/xorg-server/__changelog b/abs/core/xorg-server/__changelog
new file mode 100644
index 0000000..a0d578e
--- /dev/null
+++ b/abs/core/xorg-server/__changelog
@@ -0,0 +1,2 @@
+placeholder to prevent auto update.
+pixman cache bug
diff --git a/abs/core/xorg-server/git-fixes.patch b/abs/core/xorg-server/git-fixes.patch
deleted file mode 100644
index d1817c0..0000000
--- a/abs/core/xorg-server/git-fixes.patch
+++ /dev/null
@@ -1,643 +0,0 @@
-diff --git a/Xi/exevents.c b/Xi/exevents.c
-index 494d07e..106da3a 100644
---- a/Xi/exevents.c
-+++ b/Xi/exevents.c
-@@ -949,8 +949,6 @@ UpdateDeviceState(DeviceIntPtr device, DeviceEvent *event)
- 
-         if (!(event->flags & TOUCH_POINTER_EMULATED))
-             return DONT_PROCESS;
--        if (!(event->flags & TOUCH_END))
--            return DONT_PROCESS;
- 
-         DecreaseButtonCount(device, key, &t->buttonsDown, &t->motionMask,
-                             &t->state);
-@@ -1561,6 +1559,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
-     uint32_t touchid;
-     int type = ev->any.type;
-     int emulate_pointer = ! !(ev->device_event.flags & TOUCH_POINTER_EMULATED);
-+    DeviceIntPtr kbd;
- 
-     if (!t)
-         return;
-@@ -1570,9 +1569,6 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
-     else
-         touchid = ev->device_event.touchid;
- 
--    if (emulate_pointer)
--        UpdateDeviceState(dev, &ev->device_event);
--
-     if (type == ET_TouchBegin) {
-         ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
-                              emulate_pointer);
-@@ -1619,9 +1615,14 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
-      * events which _only_ emulate motion just work normally */
-     if (emulate_pointer && ev->any.type != ET_TouchUpdate)
-         DeliverEmulatedMotionEvent(dev, ti, ev);
-+
-     if (emulate_pointer && IsMaster(dev))
-         CheckMotion(&ev->device_event, dev);
- 
-+    kbd = GetMaster(dev, KEYBOARD_OR_FLOAT);
-+    event_set_state(NULL, kbd, &ev->device_event);
-+    ev->device_event.corestate = event_get_corestate(NULL, kbd);
-+
-     /* Make sure we have a valid window trace for event delivery; must be
-      * called after event type mutation. Touch end events are always processed
-      * in order to end touch records. */
-@@ -1643,6 +1644,9 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
-         if (ev->any.type == ET_TouchEnd)
-             TouchEndTouch(dev, ti);
-     }
-+
-+    if (emulate_pointer)
-+        UpdateDeviceState(dev, &ev->device_event);
- }
- 
- /**
-@@ -1864,6 +1868,11 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
-         goto out;
-     }
- 
-+    if (listener->state == LISTENER_AWAITING_BEGIN) {
-+        listener->state = LISTENER_HAS_END;
-+        goto out;
-+    }
-+
-     /* Event in response to reject */
-     if (ev->device_event.flags & TOUCH_REJECT) {
-         if (listener->state != LISTENER_HAS_END)
-diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
-index 0e45cb8..ab1b624 100644
---- a/Xi/xiselectev.c
-+++ b/Xi/xiselectev.c
-@@ -180,8 +180,13 @@ ProcXISelectEvents(ClientPtr client)
-                     if (CLIENT_ID(iclient->resource) == client->index)
-                         continue;
- 
--                    dixLookupDevice(&tmp, evmask->deviceid, serverClient,
--                                    DixReadAccess);
-+                    if (evmask->deviceid == XIAllDevices)
-+                        tmp = inputInfo.all_devices;
-+                    else if (evmask->deviceid == XIAllMasterDevices)
-+                        tmp = inputInfo.all_master_devices;
-+                    else
-+                        dixLookupDevice(&tmp, evmask->deviceid, serverClient,
-+                                        DixReadAccess);
-                     if (!tmp)
-                         return BadImplementation;       /* this shouldn't happen */
- 
-diff --git a/config/udev.c b/config/udev.c
-index c2d00bb..454838f 100644
---- a/config/udev.c
-+++ b/config/udev.c
-@@ -300,9 +300,15 @@ wakeup_handler(pointer data, int err, pointer read_mask)
-             return;
-         action = udev_device_get_action(udev_device);
-         if (action) {
--            if (!strcmp(action, "add") || !strcmp(action, "change")) {
-+            if (!strcmp(action, "add")) {
-                 device_removed(udev_device);
-                 device_added(udev_device);
-+            } else if (!strcmp(action, "change")) {
-+                /* ignore change for the drm devices */
-+                if (strcmp(udev_device_get_subsystem(udev_device), "drm")) {
-+                    device_removed(udev_device);
-+                    device_added(udev_device);
-+                }
-             }
-             else if (!strcmp(action, "remove"))
-                 device_removed(udev_device);
-diff --git a/dix/devices.c b/dix/devices.c
-index 9cf04ed..fd4916a 100644
---- a/dix/devices.c
-+++ b/dix/devices.c
-@@ -306,6 +306,9 @@ AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
-     /* unity matrix */
-     memset(transform, 0, sizeof(transform));
-     transform[0] = transform[4] = transform[8] = 1.0f;
-+    dev->transform.m[0][0] = 1.0;
-+    dev->transform.m[1][1] = 1.0;
-+    dev->transform.m[2][2] = 1.0;
- 
-     XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
-                            XIGetKnownProperty(XATOM_FLOAT), 32,
-@@ -440,6 +443,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
-     if (*prev != dev)
-         return FALSE;
- 
-+    TouchEndPhysicallyActiveTouches(dev);
-     ReleaseButtonsAndKeys(dev);
-     SyncRemoveDeviceIdleTime(dev->idle_counter);
-     dev->idle_counter = NULL;
-diff --git a/dix/events.c b/dix/events.c
-index 3b40446..ddb5b34 100644
---- a/dix/events.c
-+++ b/dix/events.c
-@@ -1555,11 +1555,13 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
-     WindowPtr oldWin;
- 
-     /* slave devices need to float for the duration of the grab. */
--    if (grab->grabtype == XI2 &&
-+    if (grab->grabtype == XI2 && keybd->enabled &&
-         !(passive & ImplicitGrabMask) && !IsMaster(keybd))
-         DetachFromMaster(keybd);
- 
--    if (grabinfo->grab)
-+    if (!keybd->enabled)
-+        oldWin = NULL;
-+    else if (grabinfo->grab)
-         oldWin = grabinfo->grab->window;
-     else if (keybd->focus)
-         oldWin = keybd->focus->win;
-@@ -1569,7 +1571,8 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
-         oldWin = keybd->focus->win;
-     if (keybd->valuator)
-         keybd->valuator->motionHintWindow = NullWindow;
--    DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
-+    if (oldWin)
-+        DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
-     if (syncEvents.playingEvents)
-         grabinfo->grabTime = syncEvents.time;
-     else
-@@ -1590,13 +1593,10 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
- {
-     GrabPtr grab = keybd->deviceGrab.grab;
-     DeviceIntPtr dev;
--    WindowPtr focusWin = keybd->focus ? keybd->focus->win
--        : keybd->spriteInfo->sprite->win;
-+    WindowPtr focusWin;
-     Bool wasImplicit = (keybd->deviceGrab.fromPassiveGrab &&
-                         keybd->deviceGrab.implicitGrab);
- 
--    if (focusWin == FollowKeyboardWin)
--        focusWin = inputInfo.keyboard->focus->win;
-     if (keybd->valuator)
-         keybd->valuator->motionHintWindow = NullWindow;
-     keybd->deviceGrab.grab = NullGrab;
-@@ -1607,6 +1607,17 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
-         if (dev->deviceGrab.sync.other == grab)
-             dev->deviceGrab.sync.other = NullGrab;
-     }
-+
-+    if (keybd->focus)
-+        focusWin = keybd->focus->win;
-+    else if (keybd->spriteInfo->sprite)
-+        focusWin = keybd->spriteInfo->sprite->win;
-+    else
-+        focusWin = NullWindow;
-+
-+    if (focusWin == FollowKeyboardWin)
-+        focusWin = inputInfo.keyboard->focus->win;
-+
-     DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);
- 
-     if (!wasImplicit && grab->grabtype == XI2)
-diff --git a/dix/getevents.c b/dix/getevents.c
-index 4e62507..8b4379d 100644
---- a/dix/getevents.c
-+++ b/dix/getevents.c
-@@ -896,9 +896,9 @@ scale_to_desktop(DeviceIntPtr dev, ValuatorMask *mask,
- 
-     /* scale x&y to desktop coordinates */
-     *screenx = rescaleValuatorAxis(x, dev->valuator->axes + 0, NULL,
--                                   screenInfo.x, screenInfo.width);
-+                                   screenInfo.x, screenInfo.width - 1);
-     *screeny = rescaleValuatorAxis(y, dev->valuator->axes + 1, NULL,
--                                   screenInfo.y, screenInfo.height);
-+                                   screenInfo.y, screenInfo.height - 1);
- 
-     *devx = x;
-     *devy = y;
-@@ -1400,8 +1400,9 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
-        coordinates were.
-      */
-     if (flags & POINTER_SCREEN) {
--        screenx = sx;
--        screeny = sy;
-+        scr = miPointerGetScreen(pDev);
-+        screenx = sx + scr->x;
-+        screeny = sy + scr->y;
-     }
- 
-     scr = positionSprite(pDev, (flags & POINTER_ABSOLUTE) ? Absolute : Relative,
-diff --git a/dix/touch.c b/dix/touch.c
-index 497ad7d..5f77be5 100644
---- a/dix/touch.c
-+++ b/dix/touch.c
-@@ -572,8 +572,8 @@ TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
-         return FALSE;
- 
-     /* Mark which grabs/event selections we're delivering to: max one grab per
--     * window plus the bottom-most event selection. */
--    ti->listeners = calloc(sprite->spriteTraceGood + 1, sizeof(*ti->listeners));
-+     * window plus the bottom-most event selection, plus any active grab. */
-+    ti->listeners = calloc(sprite->spriteTraceGood + 2, sizeof(*ti->listeners));
-     if (!ti->listeners) {
-         sprite->spriteTraceGood = 0;
-         return FALSE;
-@@ -1029,3 +1029,31 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
- 
-     return TouchListenerAcceptReject(dev, ti, i, mode);
- }
-+
-+/**
-+ * End physically active touches for a device.
-+ */
-+void
-+TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
-+{
-+    InternalEvent *eventlist = InitEventList(GetMaximumEventsNum());
-+    int i;
-+
-+    OsBlockSignals();
-+    mieqProcessInputEvents();
-+    for (i = 0; i < dev->last.num_touches; i++) {
-+        DDXTouchPointInfoPtr ddxti = dev->last.touches + i;
-+
-+        if (ddxti->active) {
-+            int j;
-+            int nevents = GetTouchEvents(eventlist, dev, ddxti->ddx_id,
-+                                         XI_TouchEnd, 0, NULL);
-+
-+            for (j = 0; j < nevents; j++)
-+                mieqProcessDeviceEvent(dev, eventlist + j, NULL);
-+        }
-+    }
-+    OsReleaseSignals();
-+
-+    FreeEventList(eventlist, GetMaximumEventsNum());
-+}
-diff --git a/exa/exa_priv.h b/exa/exa_priv.h
-index ea7e7fa..2e4759d 100644
---- a/exa/exa_priv.h
-+++ b/exa/exa_priv.h
-@@ -209,6 +209,7 @@ typedef struct {
-     RegionRec srcReg;
-     RegionRec maskReg;
-     PixmapPtr srcPix;
-+    PixmapPtr maskPix;
- 
-     DevPrivateKeyRec pixmapPrivateKeyRec;
-     DevPrivateKeyRec gcPrivateKeyRec;
-diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c
-index 5716138..b0a0011 100644
---- a/exa/exa_unaccel.c
-+++ b/exa/exa_unaccel.c
-@@ -442,6 +442,13 @@ ExaSrcValidate(DrawablePtr pDrawable,
-     RegionPtr dst;
-     int xoff, yoff;
- 
-+    if (pExaScr->srcPix == pPix)
-+        dst = &pExaScr->srcReg;
-+    else if (pExaScr->maskPix == pPix)
-+        dst = &pExaScr->maskReg;
-+    else
-+        return;
-+
-     exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff);
- 
-     box.x1 = x + xoff;
-@@ -449,8 +456,6 @@ ExaSrcValidate(DrawablePtr pDrawable,
-     box.x2 = box.x1 + width;
-     box.y2 = box.y1 + height;
- 
--    dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg : &pExaScr->maskReg;
--
-     RegionInit(&reg, &box, 1);
-     RegionUnion(dst, dst, &reg);
-     RegionUninit(&reg);
-@@ -495,16 +500,19 @@ ExaPrepareCompositeReg(ScreenPtr pScreen,
-         if (pSrc != pDst)
-             RegionTranslate(pSrc->pCompositeClip,
-                             -pSrc->pDrawable->x, -pSrc->pDrawable->y);
--    }
-+    } else
-+        pExaScr->srcPix = NULL;
- 
-     if (pMask && pMask->pDrawable) {
-         pMaskPix = exaGetDrawablePixmap(pMask->pDrawable);
-         RegionNull(&pExaScr->maskReg);
-         maskReg = &pExaScr->maskReg;
-+        pExaScr->maskPix = pMaskPix;
-         if (pMask != pDst && pMask != pSrc)
-             RegionTranslate(pMask->pCompositeClip,
-                             -pMask->pDrawable->x, -pMask->pDrawable->y);
--    }
-+    } else
-+        pExaScr->maskPix = NULL;
- 
-     RegionTranslate(pDst->pCompositeClip,
-                     -pDst->pDrawable->x, -pDst->pDrawable->y);
-diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
-index f8fcde9..532d87b 100644
---- a/hw/xfree86/common/Makefile.am
-+++ b/hw/xfree86/common/Makefile.am
-@@ -15,6 +15,7 @@ XVSDKINCS = xf86xv.h xf86xvmc.h xf86xvpriv.h
- endif
- 
- if XF86VIDMODE
-+XF86VMODESOURCES = xf86vmode.c
- XF86VMODE_SDK = vidmodeproc.h
- endif
- 
-@@ -47,7 +48,7 @@ libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \
-                       xf86VidMode.c xf86fbman.c xf86cmap.c \
-                       xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \
-                       xf86Mode.c xorgHelper.c xf86Extensions.h \
--		      xf86Extensions.c xf86vmode.c \
-+		      xf86Extensions.c $(XF86VMODESOURCES) \
-                       $(XVSOURCES) $(BUSSOURCES) $(RANDRSOURCES)
- nodist_libcommon_la_SOURCES = xf86DefModeSet.c xf86Build.h
- libcommon_la_LIBADD = $(top_builddir)/config/libconfig.la
-diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
-index bb2903d..74da438 100644
---- a/hw/xfree86/common/xf86.h
-+++ b/hw/xfree86/common/xf86.h
-@@ -468,4 +468,8 @@ extern _X_EXPORT ScreenPtr xf86ScrnToScreen(ScrnInfoPtr pScrn);
- /* flags passed to xf86 allocate screen */
- #define XF86_ALLOCATE_GPU_SCREEN 1
- 
-+/* Update the internal total dimensions of all ScreenRecs together */
-+extern _X_EXPORT void
-+xf86UpdateDesktopDimensions(void);
-+
- #endif                          /* _XF86_H */
-diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
-index 6de8409..4ffbf7e 100644
---- a/hw/xfree86/common/xf86Bus.c
-+++ b/hw/xfree86/common/xf86Bus.c
-@@ -81,6 +81,8 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
-     if (drv->platformProbe != NULL) {
-         foundScreen = xf86platformProbeDev(drv);
-     }
-+    if (ServerIsNotSeat0())
-+        return foundScreen;
- #endif
- 
- #ifdef XSERVER_LIBPCIACCESS
-@@ -214,6 +216,8 @@ xf86BusProbe(void)
- {
- #ifdef XSERVER_PLATFORM_BUS
-     xf86platformProbe();
-+    if (ServerIsNotSeat0())
-+        return;
- #endif
- #ifdef XSERVER_LIBPCIACCESS
-     xf86PciProbe();
-diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
-index f681a85..721159d 100644
---- a/hw/xfree86/common/xf86Helper.c
-+++ b/hw/xfree86/common/xf86Helper.c
-@@ -1898,3 +1898,9 @@ xf86ScrnToScreen(ScrnInfoPtr pScrn)
-         return screenInfo.screens[pScrn->scrnIndex];
-     }
- }
-+
-+void
-+xf86UpdateDesktopDimensions(void)
-+{
-+    update_desktop_dimensions();
-+}
-diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
-index 83f9790..f58b87e 100644
---- a/hw/xfree86/common/xf86Module.h
-+++ b/hw/xfree86/common/xf86Module.h
-@@ -80,7 +80,7 @@ typedef enum {
-  * mask is 0xFFFF0000.
-  */
- #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
--#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(13, 0)
-+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(13, 1)
- #define ABI_XINPUT_VERSION	SET_ABI_VERSION(18, 0)
- #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(7, 0)
- #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
-diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
-index 24b9473..0525e39 100644
---- a/hw/xfree86/common/xf86platformBus.c
-+++ b/hw/xfree86/common/xf86platformBus.c
-@@ -213,11 +213,12 @@ xf86platformProbe(void)
-     int i;
-     Bool pci = TRUE;
- 
-+    config_odev_probe(xf86PlatformDeviceProbe);
-+
-     if (!xf86scanpci()) {
-         pci = FALSE;
-     }
- 
--    config_odev_probe(&xf86PlatformDeviceProbe);
-     for (i = 0; i < xf86_num_platform_devices; i++) {
-         char *busid = xf86_get_platform_attrib(i, ODEV_ATTRIB_BUSID);
- 
-@@ -358,6 +359,9 @@ xf86platformProbeDev(DriverPtr drvp)
-                     break;
-             }
-             else {
-+                /* for non-seat0 servers assume first device is the master */
-+                if (ServerIsNotSeat0())
-+                    break;
-                 if (xf86_platform_devices[j].pdev) {
-                     if (xf86IsPrimaryPlatform(&xf86_platform_devices[j]))
-                         break;
-diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
-index 23f589c..40963c3 100644
---- a/hw/xfree86/dri2/dri2.c
-+++ b/hw/xfree86/dri2/dri2.c
-@@ -766,6 +766,44 @@ static inline PixmapPtr GetDrawablePixmap(DrawablePtr drawable)
-     }
- }
- 
-+/*
-+ * A TraverseTree callback to invalidate all windows using the same
-+ * pixmap
-+ */
-+static int
-+DRI2InvalidateWalk(WindowPtr pWin, pointer data)
-+{
-+    if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
-+        return WT_DONTWALKCHILDREN;
-+    DRI2InvalidateDrawable(&pWin->drawable);
-+    return WT_WALKCHILDREN;
-+}
-+
-+static void
-+DRI2InvalidateDrawableAll(DrawablePtr pDraw)
-+{
-+    if (pDraw->type == DRAWABLE_WINDOW) {
-+        WindowPtr pWin = (WindowPtr) pDraw;
-+        PixmapPtr pPixmap = pDraw->pScreen->GetWindowPixmap(pWin);
-+
-+        /*
-+         * Find the top-most window using this pixmap
-+         */
-+        while (pWin->parent &&
-+               pDraw->pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
-+            pWin = pWin->parent;
-+
-+        /*
-+         * Walk the sub-tree to invalidate all of the
-+         * windows using the same pixmap
-+         */
-+        TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
-+        DRI2InvalidateDrawable(&pPixmap->drawable);
-+    }
-+    else
-+        DRI2InvalidateDrawable(pDraw);
-+}
-+
- DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
- {
-     DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
-@@ -831,6 +869,8 @@ DrawablePtr DRI2UpdatePrime(DrawablePtr pDraw, DRI2BufferPtr pDest)
-     spix->screen_x = mpix->screen_x;
-     spix->screen_y = mpix->screen_y;
- #endif
-+
-+    DRI2InvalidateDrawableAll(pDraw);
-     return &spix->drawable;
- }
- 
-@@ -1048,18 +1088,7 @@ DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
-     return FALSE;
- }
- 
--/*
-- * A TraverseTree callback to invalidate all windows using the same
-- * pixmap
-- */
--static int
--DRI2InvalidateWalk(WindowPtr pWin, pointer data)
--{
--    if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
--        return WT_DONTWALKCHILDREN;
--    DRI2InvalidateDrawable(&pWin->drawable);
--    return WT_WALKCHILDREN;
--}
-+
- 
- int
- DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
-@@ -1162,26 +1191,7 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
-      */
-     *swap_target = pPriv->swap_count + pPriv->swapsPending;
- 
--    if (pDraw->type == DRAWABLE_WINDOW) {
--        WindowPtr pWin = (WindowPtr) pDraw;
--        PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin);
--
--        /*
--         * Find the top-most window using this pixmap
--         */
--        while (pWin->parent &&
--               pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
--            pWin = pWin->parent;
--
--        /*
--         * Walk the sub-tree to invalidate all of the
--         * windows using the same pixmap
--         */
--        TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
--        DRI2InvalidateDrawable(&pPixmap->drawable);
--    }
--    else
--        DRI2InvalidateDrawable(pDraw);
-+    DRI2InvalidateDrawableAll(pDraw);
- 
-     return Success;
- }
-diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
-index 37cd8b3..1cf0f02 100644
---- a/hw/xwin/InitOutput.c
-+++ b/hw/xwin/InitOutput.c
-@@ -164,7 +164,7 @@ void XwinExtensionInit(void)
-     int i;
- 
- #ifdef XWIN_GLX_WINDOWS
--    if ((g_fNativeGl) && (serverGeneration == 1)) {
-+    if (g_fNativeGl) {
-         /* install the native GL provider */
-         glxWinPushNativeProvider();
-     }
-@@ -901,7 +901,8 @@ InitOutput(ScreenInfo * screenInfo, int argc, char *argv[])
- {
-     int i;
- 
--    XwinExtensionInit();
-+    if (serverGeneration == 1)
-+        XwinExtensionInit();
- 
-     /* Log the command line */
-     winLogCommandLine(argc, argv);
-diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
-index 4c2f04e..33729a9 100644
---- a/hw/xwin/Makefile.am
-+++ b/hw/xwin/Makefile.am
-@@ -109,13 +109,16 @@ SRCS =	InitInput.c \
- 	winclipboard.h \
- 	winconfig.h \
- 	win.h \
-+	winglobals.h \
- 	winkeybd.h \
- 	winkeynames.h \
- 	winlayouts.h \
- 	winmessages.h \
-+	winmonitors.h \
- 	winmsg.h \
- 	winms.h \
- 	winmultiwindowclass.h \
-+	winmultiwindowicons.h \
- 	winprefs.h \
- 	winresource.h \
- 	winwindow.h \
-diff --git a/hw/xwin/glx/Makefile.am b/hw/xwin/glx/Makefile.am
-index 7222a9f..59f6879 100644
---- a/hw/xwin/glx/Makefile.am
-+++ b/hw/xwin/glx/Makefile.am
-@@ -6,7 +6,8 @@ libXwinGLX_la_SOURCES = \
- 	glwindows.h \
- 	glwrap.c \
- 	indirect.c \
--	wgl_ext_api.c
-+	wgl_ext_api.c \
-+	wgl_ext_api.h
- 
- if XWIN_MULTIWINDOW
- DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW
-diff --git a/include/input.h b/include/input.h
-index 5747f3c..f8459b8 100644
---- a/include/input.h
-+++ b/include/input.h
-@@ -579,6 +579,7 @@ extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
-                                      int listener, int mode);
- extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
-                              uint32_t touchid, Window grab_window, XID *error);
-+extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
- 
- /* misc event helpers */
- extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
-diff --git a/man/Xserver.man b/man/Xserver.man
-index 8d243d6..b103551 100644
---- a/man/Xserver.man
-+++ b/man/Xserver.man
-@@ -130,7 +130,7 @@ causes the server to generate a core dump on fatal errors.
- .B \-displayfd \fIfd\fP
- specifies a file descriptor in the launching process.  Rather than specify
- a display number, the X server will attempt to listen on successively higher
--display numbers, and upon finding a free one, will write the port number back
-+display numbers, and upon finding a free one, will write the display number back
- on this file descriptor as a newline-terminated string.  The \-pn option is
- ignored when using \-displayfd.
- .TP 8
-diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
-index 082c0db..c1af32e 100644
---- a/xkb/xkbAccessX.c
-+++ b/xkb/xkbAccessX.c
-@@ -709,7 +709,7 @@ ProcessPointerEvent(InternalEvent *ev, DeviceIntPtr mouse)
-     xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
-     DeviceEvent *event = &ev->device_event;
- 
--    dev = IsFloating(mouse) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
-+    dev = (IsMaster(mouse) || IsFloating(mouse)) ? mouse : GetMaster(mouse, MASTER_KEYBOARD);
- 
-     if (dev && dev->key) {
-         xkbi = dev->key->xkbInfo;
diff --git a/abs/core/xorg-server/use-pixman-glyph-cache.patch b/abs/core/xorg-server/use-pixman-glyph-cache.patch
deleted file mode 100644
index c1cd90d..0000000
--- a/abs/core/xorg-server/use-pixman-glyph-cache.patch
+++ /dev/null
@@ -1,270 +0,0 @@
-From 9cbcb5bd6a5360a128d15b77a02d8d3351f74366 Mon Sep 17 00:00:00 2001
-From: Søren Sandmann Pedersen <ssp@redhat.com>
-Date: Wed, 30 May 2012 09:19:08 +0000
-Subject: Use new pixman_glyph_cache_t API that will be in pixman 0.28.0
-
-This new API allows glyphs to be cached in a data structure in pixman,
-and entire glyph strings to be composited in one go.
-
-Also bump pixman dependency to 0.27.2.
-
-Results from the cairo peformance test suite running against Xvfb with
-a screen size of 1680x1050@32bpp:
-
-Speedups
-========
- xlib          firefox-talos-gfx  12416.63 -> 3603.93   3.45x speedup
-██▌
- xlib          xfce4-terminal-a1   1727.57 -> 1048.85:  1.65x speedup
-▋
- xlib                  evolution   1370.49 -> 869.34:   1.58x speedup
-▋
- xlib         gnome-terminal-vim   1832.83 -> 1251.94:  1.46x speedup
-▌
- xlib                    poppler   1519.70 -> 1204.05:  1.26x speedup
-▎
- xlib       firefox-planet-gnome   6982.55 -> 5598.16:  1.25x speedup
-▎
- xlib                  ocitysmap   1142.77 -> 1071.53:  1.07x speedup
-▏
-
-No slowdowns were reported.
-
-Results of x11perf -aa10text:
-
-Before:
-
-      8000000 reps @   0.0007 msec (1450000.0/sec)
-      8000000 reps @   0.0007 msec (1460000.0/sec)
-      8000000 reps @   0.0007 msec (1460000.0/sec)
-      8000000 reps @   0.0007 msec (1470000.0/sec)
-      8000000 reps @   0.0007 msec (1480000.0/sec)
-     40000000 trep @   0.0007 msec (1460000.0/sec)
-
-After:
-
-     32000000 reps @   0.0002 msec (4910000.0/sec)
-     32000000 reps @   0.0002 msec (4830000.0/sec)
-     32000000 reps @   0.0002 msec (4890000.0/sec)
-     32000000 reps @   0.0002 msec (4830000.0/sec)
-     32000000 reps @   0.0002 msec (4900000.0/sec)
-    160000000 trep @   0.0002 msec (4870000.0/sec)
-
-Version 2: Destroy the glyph cache at server regen time
-
-Acked-by: Aaron Plattner <aplattner@nvidia.com>
-Reviewed-by: Keith Packard <keithp@keithp.com>
-Signed-off-by: Soren Sandmann <ssp@redhat.com>
----
-diff --git a/configure.ac b/configure.ac
-index e686614..b6ed92c 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -811,7 +811,7 @@ LIBPCIACCESS="pciaccess >= 0.12.901"
- LIBUDEV="libudev >= 143"
- LIBSELINUX="libselinux >= 2.0.86"
- LIBDBUS="dbus-1 >= 1.0"
--LIBPIXMAN="pixman-1 >= 0.21.8"
-+LIBPIXMAN="pixman-1 >= 0.27.2"
- 
- dnl Pixman is always required, but we separate it out so we can link
- dnl specific modules against it
-diff --git a/fb/fb.h b/fb/fb.h
-index 75596c5..b869d12 100644
---- a/fb/fb.h
-+++ b/fb/fb.h
-@@ -1344,6 +1344,9 @@ extern _X_EXPORT void
- extern _X_EXPORT Bool
-  fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats);
- 
-+extern _X_EXPORT void
-+fbDestroyGlyphCache(void);
-+
- /*
-  * fbpixmap.c
-  */
-diff --git a/fb/fbpict.c b/fb/fbpict.c
-index 097a1a6..2804ff4 100644
---- a/fb/fbpict.c
-+++ b/fb/fbpict.c
-@@ -70,6 +70,156 @@ fbComposite(CARD8 op,
-     free_pixman_pict(pDst, dest);
- }
- 
-+static pixman_glyph_cache_t *glyphCache;
-+
-+void
-+fbDestroyGlyphCache(void)
-+{
-+    if (glyphCache)
-+    {
-+	pixman_glyph_cache_destroy (glyphCache);
-+	glyphCache = NULL;
-+    }
-+}
-+
-+static void
-+fbUnrealizeGlyph(ScreenPtr pScreen,
-+		 GlyphPtr pGlyph)
-+{
-+    if (glyphCache)
-+	pixman_glyph_cache_remove (glyphCache, pGlyph, NULL);
-+}
-+
-+static void
-+fbGlyphs(CARD8 op,
-+	 PicturePtr pSrc,
-+	 PicturePtr pDst,
-+	 PictFormatPtr maskFormat,
-+	 INT16 xSrc,
-+	 INT16 ySrc, int nlist,
-+	 GlyphListPtr list,
-+	 GlyphPtr *glyphs)
-+{
-+#define N_STACK_GLYPHS 512
-+    ScreenPtr pScreen = pDst->pDrawable->pScreen;
-+    pixman_glyph_t stack_glyphs[N_STACK_GLYPHS];
-+    pixman_glyph_t *pglyphs = stack_glyphs;
-+    pixman_image_t *srcImage, *dstImage;
-+    int srcXoff, srcYoff, dstXoff, dstYoff;
-+    GlyphPtr glyph;
-+    int n_glyphs;
-+    int x, y;
-+    int i, n;
-+    int xDst = list->xOff, yDst = list->yOff;
-+
-+    miCompositeSourceValidate(pSrc);
-+    
-+    n_glyphs = 0;
-+    for (i = 0; i < nlist; ++i)
-+	n_glyphs += list[i].len;
-+
-+    if (!glyphCache)
-+	glyphCache = pixman_glyph_cache_create();
-+
-+    pixman_glyph_cache_freeze (glyphCache);
-+    
-+    if (n_glyphs > N_STACK_GLYPHS) {
-+	if (!(pglyphs = malloc (n_glyphs * sizeof (pixman_glyph_t))))
-+	    goto out;
-+    }
-+    
-+    i = 0;
-+    x = y = 0;
-+    while (nlist--) {
-+        x += list->xOff;
-+        y += list->yOff;
-+        n = list->len;
-+        while (n--) {
-+	    const void *g;
-+
-+            glyph = *glyphs++;
-+
-+	    if (!(g = pixman_glyph_cache_lookup (glyphCache, glyph, NULL))) {
-+		pixman_image_t *glyphImage;
-+		PicturePtr pPicture;
-+		int xoff, yoff;
-+
-+		pPicture = GetGlyphPicture(glyph, pScreen);
-+		if (!pPicture) {
-+		    n_glyphs--;
-+		    goto next;
-+		}
-+
-+		if (!(glyphImage = image_from_pict(pPicture, FALSE, &xoff, &yoff)))
-+		    goto out;
-+
-+		g = pixman_glyph_cache_insert(glyphCache, glyph, NULL,
-+					      glyph->info.x,
-+					      glyph->info.y,
-+					      glyphImage);
-+
-+		free_pixman_pict(pPicture, glyphImage);
-+
-+		if (!g)
-+		    goto out;
-+	    }
-+
-+	    pglyphs[i].x = x;
-+	    pglyphs[i].y = y;
-+	    pglyphs[i].glyph = g;
-+	    i++;
-+
-+	next:
-+            x += glyph->info.xOff;
-+            y += glyph->info.yOff;
-+	}
-+	list++;
-+    }
-+
-+    if (!(srcImage = image_from_pict(pSrc, FALSE, &srcXoff, &srcYoff)))
-+	goto out;
-+
-+    if (!(dstImage = image_from_pict(pDst, TRUE, &dstXoff, &dstYoff)))
-+	goto out_free_src;
-+
-+    if (maskFormat) {
-+	pixman_format_code_t format;
-+	pixman_box32_t extents;
-+	int x, y;
-+
-+	format = maskFormat->format | (maskFormat->depth << 24);
-+
-+	pixman_glyph_get_extents(glyphCache, n_glyphs, pglyphs, &extents);
-+
-+	x = extents.x1;
-+	y = extents.y1;
-+
-+	pixman_composite_glyphs(op, srcImage, dstImage, format,
-+				xSrc + srcXoff + xDst, ySrc + srcYoff + yDst,
-+				x, y,
-+				x + dstXoff, y + dstYoff,
-+				extents.x2 - extents.x1,
-+				extents.y2 - extents.y1,
-+				glyphCache, n_glyphs, pglyphs);
-+    }
-+    else {
-+	pixman_composite_glyphs_no_mask(op, srcImage, dstImage,
-+					xSrc + srcXoff - xDst, ySrc + srcYoff - yDst,
-+					dstXoff, dstYoff,
-+					glyphCache, n_glyphs, pglyphs);
-+    }
-+
-+    free_pixman_pict(pDst, dstImage);
-+
-+out_free_src:
-+    free_pixman_pict(pSrc, srcImage);
-+
-+out:
-+    pixman_glyph_cache_thaw(glyphCache);
-+    if (pglyphs != stack_glyphs)
-+	free(pglyphs);
-+}
-+
- static pixman_image_t *
- create_solid_fill_image(PicturePtr pict)
- {
-@@ -357,7 +507,8 @@ fbPictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats)
-         return FALSE;
-     ps = GetPictureScreen(pScreen);
-     ps->Composite = fbComposite;
--    ps->Glyphs = miGlyphs;
-+    ps->Glyphs = fbGlyphs;
-+    ps->UnrealizeGlyph = fbUnrealizeGlyph;
-     ps->CompositeRects = miCompositeRects;
-     ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
-     ps->Trapezoids = fbTrapezoids;
-diff --git a/fb/fbscreen.c b/fb/fbscreen.c
-index 7c7d656..f9080a4 100644
---- a/fb/fbscreen.c
-+++ b/fb/fbscreen.c
-@@ -32,6 +32,7 @@ fbCloseScreen(ScreenPtr pScreen)
-     int d;
-     DepthPtr depths = pScreen->allowedDepths;
- 
-+    fbDestroyGlyphCache();
-     for (d = 0; d < pScreen->numDepths; d++)
-         free(depths[d].vids);
-     free(depths);
---
-cgit v0.9.0.2-2-gbebe
-- 
cgit v0.12

