package boswars tags 559615 + patch quit Kalle Olavi Niemitalo <k...@iki.fi> writes:
> I see these ways to fix or work around this bug: > > (a) putenv("SDL_MOUSE_RELATIVE=0") in boswars before SDL > initialization. AFAICT boswars does not care about relative > mouse motion. This works fine; patch attached.
From 5c740e3a68150346323c70f9141014d44a91dbcc Mon Sep 17 00:00:00 2001 From: Kalle Olavi Niemitalo <k...@iki.fi> Date: Fri, 15 Jan 2010 02:08:34 +0200 Subject: [PATCH] Fix tablet input in full-screen mode Work around an SDL 1.2 misfeature that makes Bos Wars in full-screen mode unplayable with tablet devices that report absolute coordinates. Fixes Debian bug 559615. --- engine/video/sdl.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+), 0 deletions(-) diff --git a/engine/video/sdl.cpp b/engine/video/sdl.cpp index c8cfc01..ccaeb57 100644 --- a/engine/video/sdl.cpp +++ b/engine/video/sdl.cpp @@ -381,6 +381,48 @@ void InitVideoSdl(void) Uint32 flags; if (SDL_WasInit(SDL_INIT_VIDEO) == 0) { +#ifdef HAVE_X + // Fix tablet input in full-screen mode. + // + // By default, SDL 1.2 on X11 uses mouse relative mode + // if the mouse cursor is hidden and input is grabbed. + // In this mode, SDL attempts to report the direction + // in which the mouse is moving. SDL computes this + // from the mouse-cursor coordinates it gets from X. + // If the mouse cursor of X were to hit an edge of the + // screen, SDL would not know whether the user keeps + // moving the mouse in that direction. To prevent + // that, SDL warps the mouse cursor of X back to the + // center of the screen whenever it gets too far. + // SDL then compensates for this warping in its + // relative-motion computations, and uses the relative + // coordinates to maintain its own idea of the mouse + // cursor location, separately from what X thinks. + // + // All of the above works great with mice but fails + // horribly with tablet or touch-screen devices, where + // the coordinates reported by X depend only on the + // position of the stylus and not at all on where SDL + // previously warped the pointer. Because Bos Wars + // doesn't actually care about relative mouse motion, + // let's just disable that whole feature in SDL. The + // easiest way to do that is by setting an environment + // variable. Do this before SDL_Init in case that + // caches the value. + // + // SDL 1.2 documentation warns that environment + // variables are mostly for debugging and might not be + // supported in future SDL releases. In that event, + // Bos Wars can instead use the same trick as Barrage + // does: tell SDL to show the mouse cursor, but make + // all of its pixels transparent, so it's actually + // invisible. However, SDL 1.3 is apparently going to + // support tablet devices natively, so this might not + // be needed then. + static char MouseRelative0[] = "SDL_MOUSE_RELATIVE=0"; + SDL_putenv(MouseRelative0); // doesn't want const +#endif + if (SDL_Init( #ifdef DEBUG SDL_INIT_NOPARACHUTE | -- 1.6.6
> (e) Make SDL explicitly support tablet devices (perhaps via > XInput) and pass their coordinates through unmolested. The unreleased SDL 1.3 has some native support for tablets but I don't know whether it fixes this bug.
pgp1fQWyaeQTC.pgp
Description: PGP signature