xserver: Branch 'master' - 2 commits

Peter Hutterer whot at kemper.freedesktop.org
Tue Jun 17 17:47:39 PDT 2008


 Xi/exevents.c      |   10 +++++++---
 Xi/queryst.c       |    6 +++---
 dix/devices.c      |    2 +-
 dix/events.c       |   13 +++++--------
 include/inputstr.h |    3 +++
 xkb/xkbActions.c   |    4 ++--
 6 files changed, 21 insertions(+), 17 deletions(-)

New commits:
commit 068fa63496c7c363706f0d356b5132bc591c04c6
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Wed Jun 18 09:23:09 2008 +0930

    dix: fix a crash when the client has a different byteorder.
    
    Signed-off-by: Peter Hutterer <peter at cs.unisa.edu.au>

diff --git a/dix/events.c b/dix/events.c
index a35e9e4..4e11bda 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -6168,6 +6168,10 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
     if (events->u.u.type == GenericEvent)
     {
         eventlength += ((xGenericEvent*)events)->length * 4;
+    }
+
+    if(pClient->swapped)
+    {
         if (eventlength > swapEventLen)
         {
             swapEventLen = eventlength;
@@ -6178,10 +6182,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
                 return;
             }
         }
-    }
 
-    if(pClient->swapped)
-    {
 	for(i = 0; i < count; i++)
 	{
 	    eventFrom = &events[i];
@@ -6192,7 +6193,7 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
 	    (*EventSwapVector[eventFrom->u.u.type & 0177])
 		(eventFrom, eventTo);
 
-	    (void)WriteToClient(pClient, eventlength, (char *)&eventTo);
+	    (void)WriteToClient(pClient, eventlength, (char *)eventTo);
 	}
     }
     else
commit d21155a3e9b51df946766926bc6155c8972c4439
Author: Peter Hutterer <peter at cs.unisa.edu.au>
Date:   Sun Jun 15 20:00:41 2008 +0930

    input: fix up usage of button->down, used to be a bitmask, is now an array.
    
    device->button->down used to be a 32-byte bitmask with one bit for each
    button. This has changed into a 256-byte array, with one byte assigned for
    each button. Some of the callers were still using this array as a bitmask
    however, this is fixed with this patch.
    
    Thanks to Keith Packard for pointing this out. See also:
    http://lists.freedesktop.org/archives/xorg/2008-June/036202.html

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 6f88b57..4736a12 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1153,9 +1153,11 @@ FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
     ev->num_valuators = 0;
 
     if (b) {
+	int i;
 	ev->classes_reported |= (1 << ButtonClass);
 	ev->num_buttons = b->numButtons;
-	memmove((char *)&ev->buttons[0], (char *)b->down, 4);
+	for (i = 0; i < 32; i++)
+	    SetBitIf(ev->buttons, b->down, i);
     } else if (k) {
 	ev->classes_reported |= (1 << KeyClass);
 	ev->num_keys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode;
@@ -1270,11 +1272,13 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 	    first += 3;
 	    nval -= 3;
 	    if (nbuttons > 32) {
+		int i;
 		(ev - 1)->deviceid |= MORE_EVENTS;
 		bev = (deviceButtonStateNotify *) ev++;
 		bev->type = DeviceButtonStateNotify;
 		bev->deviceid = dev->id;
-		memmove((char *)&bev->buttons[0], (char *)&b->down[4], 28);
+		for (i = 32; i < MAP_LENGTH; i++)
+		    SetBitIf(bev->buttons, b->down, i);
 	    }
 	    if (nval > 0) {
 		(ev - 1)->deviceid |= MORE_EVENTS;
@@ -1692,7 +1696,7 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
     if (BadDeviceMap(&map[0], nElts, 1, 255, &client->errorValue))
 	return BadValue;
     for (i = 0; i < nElts; i++)
-	if ((b->map[i + 1] != map[i]) && BitIsOn(b->down, i + 1))
+	if ((b->map[i + 1] != map[i]) && (b->down[i + 1]))
 	    return MappingBusy;
     for (i = 0; i < nElts; i++)
 	b->map[i + 1] = map[i];
diff --git a/Xi/queryst.c b/Xi/queryst.c
index 71ab79b..268bdd7 100644
--- a/Xi/queryst.c
+++ b/Xi/queryst.c
@@ -119,7 +119,7 @@ ProcXQueryDeviceState(ClientPtr client)
 	total_length += (sizeof(xValuatorState) + (v->numAxes * sizeof(int)));
 	num_classes++;
     }
-    buf = (char *)xalloc(total_length);
+    buf = (char *)xcalloc(total_length, 1);
     if (!buf)
 	return BadAlloc;
     savbuf = buf;
@@ -139,8 +139,8 @@ ProcXQueryDeviceState(ClientPtr client)
 	tb->class = ButtonClass;
 	tb->length = sizeof(xButtonState);
 	tb->num_buttons = b->numButtons;
-	for (i = 0; i < 32; i++)
-	    tb->buttons[i] = b->down[i];
+	for (i = 0; i < MAP_LENGTH; i++)
+            SetBitIf(tb->buttons, b->down, i);
 	buf += sizeof(xButtonState);
     }
 
diff --git a/dix/devices.c b/dix/devices.c
index b88d856..3581cde 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1734,7 +1734,7 @@ DoSetPointerMapping(ClientPtr client, DeviceIntPtr device, BYTE *map, int n)
         if ((dev->coreEvents || dev == inputInfo.pointer) && dev->button) {
             for (i = 0; i < n; i++) {
                 if ((device->button->map[i + 1] != map[i]) &&
-                    BitIsOn(device->button->down, i + 1)) {
+                        device->button->down[i + 1]) {
                     return MappingBusy;
                 }
             }
diff --git a/dix/events.c b/dix/events.c
index 8191973..a35e9e4 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4077,15 +4077,11 @@ ProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
     if (xE->u.u.type != MotionNotify)
     {
 	int  key;
-	BYTE *kptr;
-	int           bit;
 
 	XE_KBPTR.rootX = pSprite->hot.x;
 	XE_KBPTR.rootY = pSprite->hot.y;
 
 	key = xE->u.u.detail;
-	kptr = &butc->down[key >> 3];
-	bit = 1 << (key & 7);
 	switch (xE->u.u.type)
 	{
 	case ButtonPress:
diff --git a/include/inputstr.h b/include/inputstr.h
index 7209b2c..11fe031 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -57,6 +57,9 @@ SOFTWARE.
 #include "privates.h"
 
 #define BitIsOn(ptr, bit) (((BYTE *) (ptr))[(bit)>>3] & (1 << ((bit) & 7)))
+/* If byte[i] in src is non-zero, set bit i in dst, otherwise set bit to 0 */
+#define SetBitIf(dst, src, i) \
+    (src[i]) ? (dst[i/8] |= (1 << (i % 8))) : (dst[i/8] &= ~(1 << (i % 8)));
 
 #define SameClient(obj,client) \
 	(CLIENT_BITS((obj)->resource) == (client)->clientAsMask)
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 41b4e4c..8a26825 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -1045,7 +1045,7 @@ int		button;
 	switch (pAction->type) {
 	    case XkbSA_LockDeviceBtn:
 		if ((pAction->devbtn.flags&XkbSA_LockNoLock)||
-		    (dev->button->down[button/8]&(1L<<(button%8))))
+		    (dev->button->down[button]))
 		    return 0;
 		XkbDDXFakeDeviceButton(dev,True,button);
 		filter->upAction.type= XkbSA_NoAction;
@@ -1077,7 +1077,7 @@ int		button;
 	switch (filter->upAction.type) {
 	    case XkbSA_LockDeviceBtn:
 		if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)||
-		    ((dev->button->down[button/8]&(1L<<(button%8)))==0))
+		    ((dev->button->down[button])==0))
 		    return 0;
 		XkbDDXFakeDeviceButton(dev,False,button);
 		break;


More information about the xorg-commit mailing list