xf86-input-mouse signed/unsigned issue with Microsoft protocol
Michel Dänzer
michel at daenzer.net
Mon Aug 31 00:00:11 PDT 2009
On Mon, 2009-08-31 at 09:03 +1000, Peter Hutterer wrote:
> On Fri, Aug 28, 2009 at 09:17:37AM -0500, Donald Kayser wrote:
> > I am developing under a PPC embedded system running 2.6.30.2 Linux,
> > xserver from debian distribution of 7.3+19, xf86-input-mouse 1.3.0. I
> > have a custom board that I am sending Microsoft mouse 3 byte protocol
> > through a pipe to the input of xserver via the mouse driver. I was able
> > to make small movements, all positive, but if I moved negative, the mouse
> > would jump a large amount in the positive direction. I checked out from
> > git and built the mouse driver and turned on debug to find out and it is
> > not accepting negative numbers correctly in the case of PROT_MS. By
> > changing the cast on lines 1304/1305 in mouse.c from (char) to (signed
> > char), I fixed the problem. I don't know if this exists on other (non
> > PPC) platforms. I also noticed the potential for the same problem in a
> > few more places. I am using gcc-4.3.
> >
> > The source I have is from:
> > xf86-input-mouse-1.4.0-13-gf292f23
> >
> > diff --git a/src/mouse.c b/src/mouse.c
> > index aff2512..b59a138 100644
> > --- a/src/mouse.c
> > +++ b/src/mouse.c
> > @@ -1301,8 +1301,8 @@ MouseReadInput(InputInfoPtr pInfo)
> > buttons = (pMse->lastButtons & 2)
> > | ((int)(pBuf[0] & 0x20) >> 3)
> > | ((int)(pBuf[0] & 0x10) >> 4);
> > - dx = (char)(((pBuf[0] & 0x03) << 6) | (pBuf[1] & 0x3F));
> > - dy = (char)(((pBuf[0] & 0x0C) << 4) | (pBuf[2] & 0x3F));
> > + dx = (signed char)(((pBuf[0] & 0x03) << 6) | (pBuf[1] &
> > 0x3F));
> > + dy = (signed char)(((pBuf[0] & 0x0C) << 4) | (pBuf[2] &
> > 0x3F));
> > break;
> > case PROT_GLIDE: /* ALPS GlidePoint */
>
> this seems to be a problem on your particular architecture
I'd say the problem is that x86 people tend to assume char is signed by
default, when that's what C defines. (Or that C doesn't define it one
way or the other, but we have to live with that)
> and while this may be the only point where it is obvious there are
> more places where char is assumed to be signed (as you mentioned). try
> passing -fsigned-char to gcc.
Surely we should continue fixing those bugs as we've always done so far.
I've never needed to resort to -fsigned-char.
--
Earthling Michel Dänzer | http://www.vmware.com
Libre software enthusiast | Debian, X and DRI developer
More information about the xorg-devel
mailing list