xserver: Branch 'master' - 9 commits

Peter Hutterer whot at kemper.freedesktop.org
Mon Sep 21 19:44:03 PDT 2009


 Xext/mbuf.c                    |  322 ++++++++++++++++++++++++++++++++++-------
 Xi/exevents.c                  |    4 
 configure.ac                   |   24 +--
 dix/eventconvert.c             |   10 -
 dix/events.c                   |   10 -
 hw/dmx/dmxscrinit.c            |   11 +
 hw/xfree86/common/xf86DGA.c    |    2 
 hw/xfree86/modes/xf86Cursors.c |   12 -
 include/eventstr.h             |    8 -
 mi/mieq.c                      |   12 -
 xkb/xkbAccessX.c               |    2 
 xkb/xkbPrKeyEv.c               |    2 
 12 files changed, 316 insertions(+), 103 deletions(-)

New commits:
commit 66ece3bfb19642bf0f1ef73c3caa8a99c3dfb5a9
Author: Kevin E Martin <kem at redhat.com>
Date:   Tue Sep 22 11:42:24 2009 +1000

    dmx: only free the default pixmaps that we actually allocated.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/dmx/dmxscrinit.c b/hw/dmx/dmxscrinit.c
index cab212d..09734f5 100644
--- a/hw/dmx/dmxscrinit.c
+++ b/hw/dmx/dmxscrinit.c
@@ -388,8 +388,11 @@ void dmxBECloseScreen(ScreenPtr pScreen)
     } else {
 	/* Free the default drawables */
 	for (i = 0; i < dmxScreen->beNumPixmapFormats; i++) {
-	    XFreePixmap(dmxScreen->beDisplay, dmxScreen->scrnDefDrawables[i]);
-	    dmxScreen->scrnDefDrawables[i] = (Drawable)0;
+	    if (dmxScreen->scrnDefDrawables[i]) {
+		XFreePixmap(dmxScreen->beDisplay,
+			    dmxScreen->scrnDefDrawables[i]);
+		dmxScreen->scrnDefDrawables[i] = (Drawable)0;
+	    }
 	}
     }
 
commit 20fb8c2e2fccb28c1b89e6e2a5c685e1287baedb
Author: Kevin E Martin <kem at redhat.com>
Date:   Tue Sep 22 11:41:33 2009 +1000

    dmx: disable Get/SetWindowPixmap, we don't support composite/redirected windows
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/dmx/dmxscrinit.c b/hw/dmx/dmxscrinit.c
index b5afb58..cab212d 100644
--- a/hw/dmx/dmxscrinit.c
+++ b/hw/dmx/dmxscrinit.c
@@ -282,6 +282,10 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[])
     (void)dmxPictureInit(pScreen, 0, 0);
 #endif
 
+    /* Not yet... */
+    pScreen->GetWindowPixmap = NULL;
+    pScreen->SetWindowPixmap = NULL;
+
     if (dmxShadowFB && !shadowInit(pScreen, dmxShadowUpdateProc, NULL))
 	return FALSE;
 
commit fcdc1d78cca3b8bb6b77d53eda7e21d649df6943
Author: Keith Packard <keithp at keithp.com>
Date:   Mon Sep 21 19:16:59 2009 +0200

    Fix sporadic segfault on resume due to accidentally freeing cursor.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
index fc4df84..385848b 100644
--- a/hw/xfree86/modes/xf86Cursors.c
+++ b/hw/xfree86/modes/xf86Cursors.c
@@ -480,10 +480,10 @@ xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
     xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
     
+    ++cursor->refcnt;
     if (xf86_config->cursor)
 	FreeCursor (xf86_config->cursor, None);
     xf86_config->cursor = cursor;
-    ++cursor->refcnt;
     
     /* Make sure ARGB support is available */
     if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0)
commit 91e1fe5863a180b2d70a6943e83b98bbd4c9ebce
Author: Matthias Hopf <mhopf at suse.de>
Date:   Mon Sep 21 19:13:31 2009 +0200

    Revert fe31f9c + 977953b to fix issue for good.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
index 3d2d633..fc4df84 100644
--- a/hw/xfree86/modes/xf86Cursors.c
+++ b/hw/xfree86/modes/xf86Cursors.c
@@ -480,14 +480,8 @@ xf86_use_hw_cursor_argb (ScreenPtr screen, CursorPtr cursor)
     xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
     xf86CursorInfoPtr	cursor_info = xf86_config->cursor_info;
     
-    if (xf86_config->cursor) {
-	/* Under some circumstances an already set cursor is set again.
-	 * If the pointer is freed, ->bits is killed */
-	if (xf86_config->cursor != cursor)
-	    FreeCursor (xf86_config->cursor, None);
-	else
-	    --cursor->refcnt;
-    }
+    if (xf86_config->cursor)
+	FreeCursor (xf86_config->cursor, None);
     xf86_config->cursor = cursor;
     ++cursor->refcnt;
     
commit 90aa0e4a49cdd637178a771365e1e8dab8bceb87
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Sep 18 10:03:02 2009 +1000

    input: don't use typecasts to access members of InternalEvent.
    
    To avoid confusion, the member names are now postfixed with _event.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 0211e72..b0e0ede 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -944,7 +944,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
     int ret = 0;
     int state, i;
     DeviceIntPtr mouse = NULL, kbd = NULL;
-    DeviceEvent *event = (DeviceEvent*)ev;
+    DeviceEvent *event = &ev->device_event;
 
     CHECKEVENT(ev);
 
@@ -954,7 +954,7 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
         ev->any.type == ET_RawButtonRelease ||
         ev->any.type == ET_RawMotion)
     {
-        ProcessRawEvent((RawDeviceEvent*)ev, device);
+        ProcessRawEvent(&ev->raw_event, device);
         return;
     }
 
diff --git a/dix/eventconvert.c b/dix/eventconvert.c
index 21eed40..d91ba67 100644
--- a/dix/eventconvert.c
+++ b/dix/eventconvert.c
@@ -107,7 +107,7 @@ EventToCore(InternalEvent *event, xEvent *core)
         case ET_KeyPress:
         case ET_KeyRelease:
             {
-                DeviceEvent *e = (DeviceEvent*)event;
+                DeviceEvent *e = &event->device_event;
 
                 if (e->detail.key > 0xFF)
                     return BadMatch;
@@ -167,7 +167,7 @@ EventToXI(InternalEvent *ev, xEvent **xi, int *count)
         case ET_KeyRelease:
         case ET_ProximityIn:
         case ET_ProximityOut:
-            return eventToKeyButtonPointer((DeviceEvent*)ev, xi, count);
+            return eventToKeyButtonPointer(&ev->device_event, xi, count);
         case ET_DeviceChanged:
         case ET_RawKeyPress:
         case ET_RawKeyRelease:
@@ -215,19 +215,19 @@ EventToXI2(InternalEvent *ev, xEvent **xi)
         case ET_ButtonRelease:
         case ET_KeyPress:
         case ET_KeyRelease:
-            return eventToDeviceEvent((DeviceEvent*)ev, xi);
+            return eventToDeviceEvent(&ev->device_event, xi);
         case ET_ProximityIn:
         case ET_ProximityOut:
             *xi = NULL;
             return BadMatch;
         case ET_DeviceChanged:
-            return eventToDeviceChanged((DeviceChangedEvent*)ev, xi);
+            return eventToDeviceChanged(&ev->changed_event, xi);
         case ET_RawKeyPress:
         case ET_RawKeyRelease:
         case ET_RawButtonPress:
         case ET_RawButtonRelease:
         case ET_RawMotion:
-            return eventToRawEvent((RawDeviceEvent*)ev, xi);
+            return eventToRawEvent(&ev->raw_event, xi);
         default:
             break;
     }
diff --git a/dix/events.c b/dix/events.c
index 0d01df5..a79cf6d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -809,7 +809,7 @@ CheckVirtualMotion(
 
     if (qe)
     {
-        ev = (DeviceEvent*)qe->event;
+        ev = &qe->event->device_event;
         switch(ev->type)
         {
             case ET_Motion:
@@ -1130,7 +1130,7 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
     QdEventPtr	qe;
     SpritePtr	pSprite = device->spriteInfo->sprite;
     int		eventlen;
-    DeviceEvent *event = (DeviceEvent*)ev;
+    DeviceEvent *event = &ev->device_event;
 
     NoticeTime((InternalEvent*)event);
 
@@ -1179,7 +1179,7 @@ EnqueueEvent(InternalEvent *ev, DeviceIntPtr device)
             (tail->device == device) &&
 	    (tail->pScreen == pSprite->hotPhys.pScreen))
 	{
-            DeviceEvent *tailev = (DeviceEvent*)tail->event;
+            DeviceEvent *tailev = &tail->event->device_event;
 	    tailev->root_x = pSprite->hotPhys.x;
 	    tailev->root_y = pSprite->hotPhys.y;
 	    tailev->time = event->time;
@@ -1238,7 +1238,7 @@ PlayReleasedEvents(void)
 	      will translate from sprite screen to screen 0 upon reentry
 	      to the DIX layer */
 	    if(!noPanoramiXExtension) {
-                DeviceEvent *ev = (DeviceEvent*)(qe->event);
+                DeviceEvent *ev = &qe->event->device_event;
                 switch(ev->type)
                 {
                     case ET_Motion:
@@ -3993,7 +3993,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 	    FreezeThaw(thisDev, TRUE);
 	    if (!grabinfo->sync.event)
 		grabinfo->sync.event = xcalloc(1, sizeof(InternalEvent));
-	    *grabinfo->sync.event = *(DeviceEvent*)event;
+	    *grabinfo->sync.event = event->device_event;
 	    break;
 	}
     }
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 8328f58..42b7c58 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1193,7 +1193,7 @@ DGAGetOldDGAMode(int index)
 static void
 DGAHandleEvent(int screen_num, InternalEvent *ev, DeviceIntPtr device)
 {
-    DGAEvent	    *event= (DGAEvent*)ev;
+    DGAEvent	    *event= &ev->dga_event;
     ScreenPtr       pScreen = screenInfo.screens[screen_num];
     DGAScreenPtr    pScreenPriv;
 
diff --git a/include/eventstr.h b/include/eventstr.h
index f082db3..509982b 100644
--- a/include/eventstr.h
+++ b/include/eventstr.h
@@ -221,12 +221,12 @@ union _InternalEvent {
             int length;           /**< Length in bytes */
             Time time;            /**< Time in ms. */
         } any;
-        DeviceEvent device;
-        DeviceChangedEvent changed;
+        DeviceEvent device_event;
+        DeviceChangedEvent changed_event;
 #if XFreeXDGA
-        DGAEvent dga;
+        DGAEvent dga_event;
 #endif
-        RawDeviceEvent raw;
+        RawDeviceEvent raw_event;
 };
 
 #endif
diff --git a/mi/mieq.c b/mi/mieq.c
index 0b64882..4c6c3bd 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -269,7 +269,7 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
         case ET_ProximityOut:
         case ET_Hierarchy:
         case ET_DeviceChanged:
-            event->device.deviceid = dev->id;
+            event->device_event.deviceid = dev->id;
             break;
 #if XFreeXDGA
         case ET_DGAEvent:
@@ -280,7 +280,7 @@ ChangeDeviceID(DeviceIntPtr dev, InternalEvent* event)
         case ET_RawButtonPress:
         case ET_RawButtonRelease:
         case ET_RawMotion:
-            event->raw.deviceid = dev->id;
+            event->raw_event.deviceid = dev->id;
             break;
         default:
             ErrorF("[mi] Unknown event type (%d), cannot change id.\n",
@@ -299,11 +299,11 @@ FixUpEventForMaster(DeviceIntPtr mdev, DeviceIntPtr sdev,
     if (original->any.type == ET_ButtonPress ||
         original->any.type == ET_ButtonRelease)
     {
-        int btn = original->device.detail.button;
+        int btn = original->device_event.detail.button;
         if (!sdev->button)
             return; /* Should never happen */
 
-        master->device.detail.button = sdev->button->map[btn];
+        master->device_event.detail.button = sdev->button->map[btn];
     }
 }
 
@@ -382,8 +382,8 @@ mieqProcessDeviceEvent(DeviceIntPtr dev,
         case ET_ButtonRelease:
             if (dev && screen && screen != DequeueScreen(dev) && !handler) {
                 DequeueScreen(dev) = screen;
-                x = event->device.root_x;
-                y = event->device.root_y;
+                x = event->device_event.root_x;
+                y = event->device_event.root_y;
                 NewCurrentScreen (dev, DequeueScreen(dev), x, y);
             }
             break;
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index fd30a1c..2fc7642 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -690,7 +690,7 @@ XkbSrvInfoPtr	xkbi = NULL;
 unsigned 	changed = 0;
 ProcessInputProc backupproc;
 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(mouse);
-DeviceEvent     *event = (DeviceEvent*)ev;
+DeviceEvent     *event = &ev->device_event;
 
     dev = (IsMaster(mouse) || mouse->u.master) ? GetMaster(mouse, MASTER_KEYBOARD) : mouse;
 
diff --git a/xkb/xkbPrKeyEv.c b/xkb/xkbPrKeyEv.c
index 8f6705f..630f17c 100644
--- a/xkb/xkbPrKeyEv.c
+++ b/xkb/xkbPrKeyEv.c
@@ -148,7 +148,7 @@ ProcessKeyboardEvent(InternalEvent *ev, DeviceIntPtr keybd)
     XkbSrvInfoPtr xkbi = NULL;
     ProcessInputProc backup_proc;
     xkbDeviceInfoPtr xkb_priv = XKBDEVICEINFO(keybd);
-    DeviceEvent *event = (DeviceEvent*)ev;
+    DeviceEvent *event = &ev->device_event;
     int is_press = (event->type == ET_KeyPress);
     int is_release = (event->type == ET_KeyRelease);
 
commit 693d4fdb1c7b7c789a812790122454e718602449
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Sep 22 11:13:58 2009 +1000

    Xext: switch mbuf.c to dixLookupResourceByType
    
    Resolves a linker error caused by LookupIDByType.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/mbuf.c b/Xext/mbuf.c
index dd223f0..1f24974 100644
--- a/Xext/mbuf.c
+++ b/Xext/mbuf.c
@@ -741,6 +741,7 @@ ProcDisplayImageBuffers (client)
     int		    i, j;
     CARD32	    minDelay;
     TimeStamp	    activateTime, bufferTime;
+    int		    rc;
     
 
     REQUEST_AT_LEAST_SIZE (xMbufDisplayImageBuffersReq);
@@ -762,9 +763,9 @@ ProcDisplayImageBuffers (client)
     activateTime.milliseconds = 0;
     for (i = 0; i < nbuf; i++)
     {
-	pMultibuffer[i] = (MultibufferPtr) LookupIDByType (ids[i], 
-MultibufferResType);
-	if (!pMultibuffer[i])
+	rc = dixLookupResourceByType(&pMultibuffer[i], ids[i],
+		MultibufferResType, client, DixUseAccess);
+	if (rc != Success)
 	{
 	    xfree(ppMultibuffers);
 	    xfree(pMultibuffer);
@@ -835,8 +836,9 @@ ProcSetMBufferAttributes (client)
     rc = dixLookupWindow(&pWin, stuff->window, client, DixUnknownAccess);
     if (rc != Success)
 	return rc;
-    pMultibuffers = (MultibuffersPtr)LookupIDByType (pWin->drawable.id, MultibuffersResType);
-    if (!pMultibuffers)
+    rc = dixLookupResourceByType(&pMultibuffers, pWin->drawable.id,
+	    MultibufferResType, client, DixSetAttrAccess);
+    if (rc != Success)
 	return BadMatch;
     len = stuff->length - bytes_to_int32(sizeof (xMbufSetMBufferAttributesReq));
     vmask = stuff->valueMask;
@@ -887,8 +889,9 @@ ProcGetMBufferAttributes (client)
     rc = dixLookupWindow(&pWin, stuff->window, client, DixUnknownAccess);
     if (rc != Success)
 	return rc;
-    pMultibuffers = (MultibuffersPtr)LookupIDByType (pWin->drawable.id, MultibuffersResType);
-    if (!pMultibuffers)
+    rc = dixLookupResourceByType(&pMultibuffers, pWin->drawable.id,
+	    MultibufferResType, client, DixGetAttrAccess);
+    if (rc != Success)
 	return BadAccess;
     ids = xalloc (pMultibuffers->numMultibuffer * sizeof (XID));
     if (!ids)
@@ -928,10 +931,13 @@ ProcSetBufferAttributes (client)
     XID		*vlist;
     Mask	eventMask;
     int		result;
+    int		rc;
 
     REQUEST_AT_LEAST_SIZE (xMbufSetBufferAttributesReq);
-    pMultibuffer = (MultibufferPtr) LookupIDByType (stuff->buffer, MultibufferResType);
-    if (!pMultibuffer)
+
+    rc = dixLookupResourceByType(&pMultibuffer, stuff->buffer,
+	    MultibufferResType, client, DixSetAttrAccess);
+    if (rc != Success)
 	return MultibufferErrorBase + MultibufferBadBuffer;
     len = stuff->length - bytes_to_int32(sizeof (xMbufSetBufferAttributesReq));
     vmask = stuff->valueMask;
@@ -968,10 +974,12 @@ ProcGetBufferAttributes (client)
     xMbufGetBufferAttributesReply	rep;
     OtherClientsPtr		other;
     int				n;
+    int				rc;
 
     REQUEST_SIZE_MATCH (xMbufGetBufferAttributesReq);
-    pMultibuffer = (MultibufferPtr) LookupIDByType (stuff->buffer, MultibufferResType);
-    if (!pMultibuffer)
+    rc = dixLookupResourceByType(&pMultibuffer, stuff->buffer,
+	    MultibufferResType, client, DixGetAttrAccess);
+    if (rc != Success)
 	return MultibufferErrorBase + MultibufferBadBuffer;
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
@@ -1078,10 +1086,12 @@ ProcClearImageBufferArea (client)
     int width, height;
     DrawablePtr pDrawable;
     ScreenPtr pScreen;
+    int rc;
 
     REQUEST_SIZE_MATCH (xMbufClearImageBufferAreaReq);
-    pMultibuffer = (MultibufferPtr) LookupIDByType (stuff->buffer, MultibufferResType);
-    if (!pMultibuffer)
+    rc = dixLookupResourceByType(&pMultibuffer, stuff->buffer,
+	    MultibufferResType, client, DixWriteAccess);
+    if (rc != Success)
 	return MultibufferErrorBase + MultibufferBadBuffer;
     if ((stuff->exposures != xTrue) && (stuff->exposures != xFalse))
     {
commit 493d2f9c2fc56dd3b4c03451c07cd25e3012142e
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Sep 22 11:05:07 2009 +1000

    Xext: remove DisplayImageBuffers from mbuf.c
    
    Not referenced by anything.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/mbuf.c b/Xext/mbuf.c
index e2306a2..dd223f0 100644
--- a/Xext/mbuf.c
+++ b/Xext/mbuf.c
@@ -1499,42 +1499,6 @@ GetBufferPointer (pWin, i)
     return (DrawablePtr) pMultibuffers->buffers[i].pPixmap;
 }
 
-int
-DisplayImageBuffers (ids, nbuf)
-    XID	    *ids;
-    int	    nbuf;
-{
-    MultibufferPtr  *pMultibuffer;
-    MultibuffersPtr *pMultibuffers;
-    int		    i, j;
-
-    pMultibuffer = xalloc (nbuf * sizeof *pMultibuffer +
-			    nbuf * sizeof *pMultibuffers);
-    if (!pMultibuffer)
-	return BadAlloc;
-    pMultibuffers = (MultibuffersPtr *) (pMultibuffer + nbuf);
-    for (i = 0; i < nbuf; i++)
-    {
-	pMultibuffer[i] = (MultibufferPtr) LookupIDByType (ids[i], MultibufferResType);
-	if (!pMultibuffer[i])
-	{
-	    xfree (pMultibuffer);
-	    return MultibufferErrorBase + MultibufferBadBuffer;
-	}
-	pMultibuffers[i] = pMultibuffer[i]->pMultibuffers;
-	for (j = 0; j < i; j++)
-	    if (pMultibuffers[i] == pMultibuffers[j])
-	    {
-		xfree (pMultibuffer);
-		return BadMatch;
-	    }
-    }
-    PerformDisplayRequest (pMultibuffers, pMultibuffer, nbuf);
-    xfree (pMultibuffer);
-    return Success;
-}
-
-
 static Bool
 QueueDisplayRequest (client, activateTime)
     ClientPtr	    client;
commit fff40b3353c7025c1d1e3dd14b5c78f7c9f5de7c
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Tue Sep 22 10:53:47 2009 +1000

    Xext: fix up multibuffer compiler errors.
    
    Triggered by the xextproto 7.1 change, fixed by moving the matching
    declarations from the header file to here.
    
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/mbuf.c b/Xext/mbuf.c
index 55e732a..e2306a2 100644
--- a/Xext/mbuf.c
+++ b/Xext/mbuf.c
@@ -41,8 +41,9 @@ in this Software without prior written authorization from The Open Group.
 #include "resource.h"
 #include "opaque.h"
 #include "sleepuntil.h"
-#define _MULTIBUF_SERVER_	/* don't want Xlib structures */
-#include <X11/extensions/multibufst.h>
+#include "inputstr.h"
+#include <X11/extensions/multibufconst.h>
+#include <X11/extensions/multibufproto.h>
 
 #include <stdio.h>
 #if !defined(WIN32)
@@ -57,6 +58,251 @@ in this Software without prior written authorization from The Open Group.
 
 #define ValidEventMasks (ExposureMask|MultibufferClobberNotifyMask|MultibufferUpdateNotifyMask)
 
+/* The _Multibuffer and _Multibuffers structures below refer to each other,
+ * so we need this forward declaration
+ */
+typedef struct _Multibuffers	*MultibuffersPtr;
+
+/*
+ * per-Multibuffer data
+ */
+typedef struct _Multibuffer {
+    MultibuffersPtr pMultibuffers;  /* associated window data */
+    Mask	    eventMask;	    /* MultibufferClobberNotifyMask|ExposureMask|MultibufferUpdateNotifyMask */
+    Mask	    otherEventMask; /* mask of all other clients event masks */
+    OtherClients    *otherClients;  /* other clients that want events */
+    int		    number;	    /* index of this buffer into array */
+    int		    side;	    /* always Mono */
+    int		    clobber;	    /* Unclobbered, PartiallyClobbered, FullClobbered */
+    PixmapPtr	    pPixmap;	    /* associated pixmap */
+} MultibufferRec, *MultibufferPtr;
+
+/*
+ * per-window data
+ */
+
+typedef struct _Multibuffers {
+    WindowPtr	pWindow;		/* associated window */
+    int		numMultibuffer;		/* count of buffers */
+    int		refcnt;			/* ref count for delete */
+    int		displayedMultibuffer;	/* currently active buffer */
+    int		updateAction;		/* Undefined, Background, Untouched, Copied */
+    int		updateHint;		/* Frequent, Intermittent, Static */
+    int		windowMode;		/* always Mono */
+
+    TimeStamp	lastUpdate;		/* time of last update */
+
+    unsigned short	width, height;	/* last known window size */
+    short		x, y;		/* for static gravity */
+
+    MultibufferPtr	buffers;        /* array of numMultibuffer buffers */
+} MultibuffersRec;
+
+/*
+ * per-screen data
+ */
+typedef struct _MultibufferScreen {
+    PositionWindowProcPtr PositionWindow;		/* pWin, x,y */
+} MultibufferScreenRec, *MultibufferScreenPtr;
+
+/*
+ * per display-image-buffers request data.
+ */
+
+typedef struct _DisplayRequest {
+    struct _DisplayRequest	*next;
+    TimeStamp			activateTime;
+    ClientPtr			pClient;
+    XID				id;
+} DisplayRequestRec, *DisplayRequestPtr;
+
+#define DestroyWindowMask		(1L<<0)
+#define PositionWindowMask		(1L<<1)
+#define PostValidateTreeMask		(1L<<2)
+#define ClipNotifyMask			(1L<<3)
+#define WindowExposuresMask		(1L<<4)
+#define CopyWindowMask			(1L<<5)
+#define ClearToBackgroundMask		(1L<<6)
+#define ChangeWindowAttributesMask	(1L<<7)
+
+extern int		MultibufferScreenIndex;
+extern int		MultibufferWindowIndex;
+
+extern RESTYPE		MultibufferDrawableResType;
+
+extern void		MultibufferUpdate(	/* pMbuffer, time */
+				MultibufferPtr /* pMultibuffer */,
+				CARD32 /* time */
+				);
+extern void		MultibufferExpose(	/* pMbuffer, pRegion */
+				MultibufferPtr /* pMultibuffer */,
+				RegionPtr /* pRegion */
+				);
+extern void		MultibufferClobber(	/* pMbuffer */
+				MultibufferPtr /* pMultibuffer */
+				);
+
+typedef struct _mbufWindow	*mbufWindowPtr;
+
+void DestroyImageBuffers (WindowPtr	pWin);
+
+/*
+ * per-buffer data
+ */
+
+#define MB_DISPLAYED_BUFFER(pMBWindow) \
+    ((pMBWindow)->buffers + (pMBWindow)->displayedMultibuffer)
+
+typedef struct _mbufBuffer {
+    mbufWindowPtr   pMBWindow;	    /* associated window data */
+    Mask	    eventMask;	    /* client event mask */
+    Mask	    otherEventMask; /* union of other clients' event masks */
+    OtherClientsPtr otherClients;   /* other clients that want events */
+    int		    number;	    /* index of this buffer into array */
+    int		    side;	    /* stero side: always Mono */
+    int		    clobber;	    /* clober state */
+    DrawablePtr	    pDrawable;	    /* associated drawable */
+} mbufBufferRec, *mbufBufferPtr;
+
+
+/*
+ * per-window data
+ */
+
+#define MB_WINDOW_PRIV(pWin) \
+    ((mbufWindowPtr)((pWin)->devPrivates[MultibufferWindowIndex].ptr))
+
+typedef struct _mbufWindow {
+    WindowPtr	pWindow;		/* associated window */
+    int		numMultibuffer;		/* count of buffers */
+    mbufBufferPtr buffers;		/* array of (numMultibuffer) buffers */
+    int		displayedMultibuffer;	/* currently active buffer */
+    int		updateAction;		/* Undefined, Background,
+					   Untouched, Copied */
+    int		updateHint;		/* Frequent, Intermittent, Static */
+    int		windowMode;		/* always Mono */
+    TimeStamp	lastUpdate;		/* time of last update */
+    short		x, y;		/* for static gravity */
+    unsigned short	width, height;	/* last known window size */
+    DevUnion		devPrivate;
+} mbufWindowRec;
+
+
+/*
+ * per-screen data
+ */
+
+#define MB_SCREEN_PRIV(pScreen) \
+    ((mbufScreenPtr)((pScreen)->devPrivates[MultibufferScreenIndex].ptr))
+
+typedef struct _mbufScreen {
+    long mbufWindowCount;		/* count of multibuffered windows */
+
+    /* Wrap pScreen->DestroyWindow */
+    DestroyWindowProcPtr DestroyWindow;
+    long funcsWrapped;			/* flags which functions are wrapped */
+
+    /* Initialized by device-dependent section */
+    int  nInfo;				/* number of buffer info rec's */
+    xMbufBufferInfo *pInfo;		/* buffer info (for Normal buffers) */
+
+    int  (* CreateImageBuffers)(
+		WindowPtr		/* pWin */,
+		int			/* nbuf */,
+		XID *			/* ids */,
+		int			/* action */,
+		int			/* hint */
+		);
+    void (* DestroyImageBuffers)(
+		WindowPtr		/* pWin */
+		);
+    void (* DisplayImageBuffers)(
+		ScreenPtr		/* pScreen */,
+		mbufBufferPtr *		/* ppMBBuffer */,
+		mbufWindowPtr *		/* ppMBWindow */,
+		int			/* nbuf */
+		);
+    void (* ClearImageBufferArea)(
+		mbufBufferPtr		/* pMBBuffer */,
+		short			/* x */,
+		short			/* y */,
+		unsigned short		/* width */,
+		unsigned short		/* height */,
+		Bool			/* exposures */
+		);
+    Bool (* ChangeMBufferAttributes)(	/* pMBWindow, vmask */
+		/* FIXME */
+		);
+    Bool (* ChangeBufferAttributes)(	/* pMBBuffer, vmask */
+		/* FIXME */
+		);
+    void (* DeleteBufferDrawable)(
+		DrawablePtr		/* pDrawable */
+		);
+    void (* WrapScreenFuncs)(
+		ScreenPtr		/* pScreen */
+		);
+    void (* ResetProc)(
+		ScreenPtr		/* pScreen */
+		);
+    DevUnion	devPrivate;
+} mbufScreenRec, *mbufScreenPtr;
+
+
+/* Privates to mbufScreenRec */
+
+#ifdef _MULTIBUF_PIXMAP_
+#define MB_SCREEN_PRIV_PIXMAP(pScreen) \
+    ((mbufPixmapPrivPtr) MB_SCREEN_PRIV((pScreen))->devPrivate.ptr)
+
+typedef struct _mbufPixmapPriv
+{
+    /* Pointers to wrapped functions */
+    PositionWindowProcPtr PositionWindow;		/* pWin, x,y */
+    long funcsWrapped;			/* flags which functions are wrapped */
+} mbufPixmapPrivRec, *mbufPixmapPrivPtr;
+#endif /* _MULTIBUF_PIXMAP_ */
+
+
+#ifdef _MULTIBUF_BUFFER_
+
+extern int frameWindowPrivateIndex;
+
+#define MB_SCREEN_PRIV_BUFFER(pScreen) \
+    ((mbufBufferPrivPtr) MB_SCREEN_PRIV((pScreen))->devPrivate.ptr)
+
+typedef struct _mbufBufferPriv
+{
+    DevUnion	*frameBuffer;	/* Array of screen framebuffers */
+    DevUnion	selectPlane;	/* Plane(s) that select displayed buffer */
+
+    /*
+     * Note: subtractRgn and unionRgn may overlap. subtractRgn is a union
+     * of all the old clipLists of the windows that are displaying
+     * the backbuffer. unionRgn is the union of all the new clipLists
+     * of the same windows.
+     */
+
+    RegionRec	backBuffer;	/* Area of screen displaying back buffer */
+    RegionRec   subtractRgn;	/* Regions lost to backBuffer   */
+    RegionRec   unionRgn;	/* Regions gained by backBuffer */
+    Bool	rgnChanged;	/* TRUE if "backBuffer" needs to be updated */
+
+    void (* CopyBufferBits)();	/* pMBWindow, srcBufferNum, dstBufferNum */
+    void (* DrawSelectPlane)();	/* pScreen, selectPlane, pRegion, bufferNum */
+
+    /* Pointers to wrapped functions */
+    PostValidateTreeProcPtr	PostValidateTree; /* pParent, pChild, kind */
+    ClipNotifyProcPtr		ClipNotify;       /* pWin, dx, dy */
+    WindowExposuresProcPtr	WindowExposures;  /* pWin, pRegion */
+    CopyWindowProcPtr		CopyWindow;       /* pWin, oldPt, pOldRegion */
+    ClearToBackgroundProcPtr	ClearToBackground; /* pWin, x,y,w,h, sendExpose */
+    ChangeWindowAttributesProcPtr ChangeWindowAttributes; /* pWin, vmask */
+    long funcsWrapped;			/* flags which functions are wrapped */
+    unsigned  inClearToBackground:1;	/* used by WindowExposure */
+} mbufBufferPrivRec, *mbufBufferPrivPtr;
+#endif /* _MULTIBUF_BUFFER_ */
+
 static int		MultibufferEventBase;
 static int		MultibufferErrorBase;
 static int MultibufferScreenPrivKeyIndex;
commit 4c8f834da6c8c84849313453fe223a8165c6afc0
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Mon Sep 21 14:52:31 2009 +1000

    configure: fix up check for tslib.
    
    Reduce the tslib-check to the pkg-config check only instead of the previous
    library symbol check followd by a pkg-config check.
    
    This patch also reduces the required version of tslib back down to
    tslib-0.0. Unfortunately, the 1.0 tarball available through
    http://tslib.berlios.de/ still announces itself as 0.0.2.
    
    Reported-by: Werner Landgraf
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/configure.ac b/configure.ac
index bb45941..93788cb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1858,19 +1858,19 @@ if test "$KDRIVE" = yes; then
         KDRIVEFBDEVLIB=yes
         AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server])
     fi
-    
-    # tslib...
-    AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
-    if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
-        TSLIB=yes
+
+
+    PKG_CHECK_MODULES([TSLIB], [tslib-0.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
+    if test "x$HAVE_TSLIB" = xauto; then
+        TSLIB="$HAVE_TSLIB"
     fi
 
     if test "x$TSLIB" = xyes; then
         if ! test "x$HAVE_TSLIB" = xyes; then
-            AC_MSG_ERROR([tslib must be installed to build the tslib input driver.])
+            AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
+        else
+            AC_DEFINE(TSLIB, 1, [Have tslib support])
         fi
-        TSLIB_LIBS="-lts"
-        AC_DEFINE(TSLIB, 1, [Have tslib support])
     fi
 
     AC_CHECK_HEADERS([SDL/SDL.h])
@@ -1902,14 +1902,6 @@ if test "$KDRIVE" = yes; then
     AC_CHECK_FUNC([nanosleep], [],
         AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
     
-    if test "x$TSLIB" = xyes; then
-        PKG_CHECK_MODULES([TSLIB], [tslib-1.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
-        if test "x$HAVE_TSLIB" = xno; then
-            AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
-        fi
-        AC_DEFINE(TSLIB, 1, [Have tslib support])
-    fi
-
     # damage shadow extension glx (NOTYET) fb mi
     KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
     KDRIVE_PURE_INCS="$KDRIVE_INC $MIEXT_DAMAGE_INC $MIEXT_SHADOW_INC $XEXT_INC $FB_INC $MI_INC"


More information about the xorg-commit mailing list