[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#346460: evdev driver broken on big-endian machines (patch)



reopen 346460 
retitle 346460 evdev driver broken on big-endian machines
tags 346460 + patch
thanks

This bug is not fixed, it still is in 6.9.0.dfsg.1-4.

I had same time to look into the problem: The current evdev driver
doesn't work on big-endian machines.  Here's patch that fixes that
by using the macros from Vojtech Pavlik's evtest.c.


        Juergen

--- orig/xorg-x11-6.9.0.dfsg.1/xc/programs/Xserver/hw/xfree86/input/evdev/evdev.c	2005-12-29 03:35:09.000000000 +0100
+++ xorg-x11-6.9.0.dfsg.1/xc/programs/Xserver/hw/xfree86/input/evdev/evdev.c	2006-01-18 19:31:46.000000000 +0100
@@ -199,7 +199,11 @@
         xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
 }
 
-#define TestBit(bit, array) (array[(bit) / 8] & (1 << ((bit) % 8)))
+#define BITS_PER_LONG (sizeof(long) * 8)
+#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+#define OFF(x)  ((x)%BITS_PER_LONG)
+#define LONG(x) ((x)/BITS_PER_LONG)
+#define TestBit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
 
 static void
 EvdevPtrCtrlProc(DeviceIntPtr device, PtrCtrl *ctrl)
@@ -565,8 +569,8 @@
 static int
 EvdevProbe(InputInfoPtr pInfo)
 {
-    char key_bitmask[(KEY_MAX + 7) / 8];
-    char rel_bitmask[(REL_MAX + 7) / 8];
+    unsigned long key_bitmask[NBITS(KEY_MAX)];
+    unsigned long rel_bitmask[NBITS(KEY_MAX)];
     int i, has_axes, has_buttons, has_keys;
     EvdevPtr pEvdev = pInfo->private;
 
=

-- 
Juergen Kreileder, Blackdown Java-Linux Team
http://blog.blackdown.de/



Reply to: