From 613c6f4f7f3a64f857ca59e453b5e53d01e64899 Mon Sep 17 00:00:00 2001 From: rsn8887 Date: Thu, 16 Feb 2017 03:19:59 -0600 Subject: SDL: More fixes to jerky analog joystick pointer For some engines such as Dreamweb that a previous fix did not apply to, this fixes bug 6996: Android: Mouse pointer control with analog joystick is unusable --- backends/events/dinguxsdl/dinguxsdl-events.cpp | 28 ++--- backends/events/gph/gph-events.cpp | 74 ++++++------- .../events/linuxmotosdl/linuxmotosdl-events.cpp | 30 +++--- backends/events/maemosdl/maemosdl-events.cpp | 4 +- backends/events/openpandora/op-events.cpp | 14 +-- backends/events/ps3sdl/ps3sdl-events.cpp | 8 +- backends/events/sdl/sdl-events.cpp | 118 ++++++++++++++------- backends/events/sdl/sdl-events.h | 5 +- backends/events/symbiansdl/symbiansdl-events.cpp | 36 +++---- backends/events/wincesdl/wincesdl-events.cpp | 8 +- 10 files changed, 184 insertions(+), 141 deletions(-) (limited to 'backends/events') diff --git a/backends/events/dinguxsdl/dinguxsdl-events.cpp b/backends/events/dinguxsdl/dinguxsdl-events.cpp index 0492c569e1..f61023206b 100644 --- a/backends/events/dinguxsdl/dinguxsdl-events.cpp +++ b/backends/events/dinguxsdl/dinguxsdl-events.cpp @@ -72,54 +72,54 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { if (ev.key.keysym.sym == PAD_UP) { if (ev.type == SDL_KEYDOWN) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == PAD_DOWN) { if (ev.type == SDL_KEYDOWN) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == PAD_LEFT) { if (ev.type == SDL_KEYDOWN) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == PAD_RIGHT) { if (ev.type == SDL_KEYDOWN) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == BUT_Y) { // left mouse button @@ -129,7 +129,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == BUT_B) { // right mouse button @@ -139,7 +139,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_RBUTTONUP; } - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == BUT_X) { // '.' skip dialogue diff --git a/backends/events/gph/gph-events.cpp b/backends/events/gph/gph-events.cpp index 88fc97d3d1..06acfa489e 100644 --- a/backends/events/gph/gph-events.cpp +++ b/backends/events/gph/gph-events.cpp @@ -230,116 +230,116 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { switch (ev.jbutton.button) { case BUTTON_UP: if (_km.y_down_count != 2) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = -4; + _km.y_vel = -4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_DOWN: if (_km.y_down_count != 2) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 4; + _km.y_vel = 4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_LEFT: if (_km.x_down_count != 2) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = -4; + _km.x_vel = -4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_RIGHT: if (_km.x_down_count != 3) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 4; + _km.x_vel = 4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_UPLEFT: if (_km.x_down_count != 2) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = -4; + _km.x_vel = -4 * _km.multiplier; } if (_km.y_down_count != 2) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = -4; + _km.y_vel = -4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_UPRIGHT: if (_km.x_down_count != 2) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 4; + _km.x_vel = 4 * _km.multiplier; } if (_km.y_down_count != 2) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = -4; + _km.y_vel = -4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_DOWNLEFT: if (_km.x_down_count != 2) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = -4; + _km.x_vel = -4 * _km.multiplier; } if (_km.y_down_count != 2) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 4; + _km.y_vel = 4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_DOWNRIGHT: if (_km.x_down_count != 2) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 4; + _km.x_vel = 4 * _km.multiplier; } if (_km.y_down_count != 2) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 4; + _km.y_vel = 4 * _km.multiplier; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_B: case BUTTON_CLICK: event.type = Common::EVENT_LBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_X: event.type = Common::EVENT_RBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_L: BUTTON_STATE_L = true; @@ -454,16 +454,16 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { _km.x_vel = 0; _km.x_down_count = 0; event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_B: case BUTTON_CLICK: event.type = Common::EVENT_LBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_X: event.type = Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BUTTON_L: BUTTON_STATE_L = false; diff --git a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp index b0d443ff9f..3f29cc93fe 100644 --- a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp +++ b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp @@ -130,53 +130,53 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { // Joystick to Mouse else if (ev.key.keysym.sym == SDLK_LEFT) { if (ev.type == SDL_KEYDOWN) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_RIGHT) { if (ev.type == SDL_KEYDOWN) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_DOWN) { if (ev.type == SDL_KEYDOWN) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_UP) { if (ev.type == SDL_KEYDOWN) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_RETURN) { @@ -187,7 +187,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_PLUS) { @@ -197,7 +197,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } else { event.type = Common::EVENT_RBUTTONUP; } - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else if (ev.key.keysym.sym == SDLK_MINUS) { @@ -208,7 +208,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } else { diff --git a/backends/events/maemosdl/maemosdl-events.cpp b/backends/events/maemosdl/maemosdl-events.cpp index 8b7514004a..a1f2f4123c 100644 --- a/backends/events/maemosdl/maemosdl-events.cpp +++ b/backends/events/maemosdl/maemosdl-events.cpp @@ -96,7 +96,7 @@ bool MaemoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } } else if (ev.key.keysym.sym == SDLK_F7) { event.type = Common::EVENT_RBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); debug(9, "remapping to right click down"); return true; } else if (ev.key.keysym.sym == SDLK_F8) { @@ -134,7 +134,7 @@ bool MaemoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } } else if (ev.key.keysym.sym == SDLK_F7) { event.type = Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); debug(9, "remapping to right click up"); return true; } else if (ev.key.keysym.sym == SDLK_F8) { diff --git a/backends/events/openpandora/op-events.cpp b/backends/events/openpandora/op-events.cpp index b9d5fa8c7b..dbfcc4ed2c 100644 --- a/backends/events/openpandora/op-events.cpp +++ b/backends/events/openpandora/op-events.cpp @@ -126,18 +126,18 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (ev.key.keysym.sym) { case SDLK_LEFT: event.type = (ev.type == SDL_KEYDOWN) ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; case SDLK_RIGHT: event.type = (ev.type == SDL_KEYDOWN) ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; #if defined(SDL_BUTTON_MIDDLE) case SDLK_UP: event.type = (ev.type == SDL_KEYDOWN) ? Common::EVENT_MBUTTONDOWN : Common::EVENT_MBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; #endif @@ -150,12 +150,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (ev.key.keysym.sym) { case SDLK_HOME: event.type = Common::EVENT_LBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; case SDLK_END: event.type = Common::EVENT_RBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; case SDLK_PAGEDOWN: @@ -188,12 +188,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (ev.key.keysym.sym) { case SDLK_HOME: event.type = Common::EVENT_LBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; case SDLK_END: event.type = Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; break; case SDLK_PAGEDOWN: diff --git a/backends/events/ps3sdl/ps3sdl-events.cpp b/backends/events/ps3sdl/ps3sdl-events.cpp index 1fc10559c2..bad0160b9d 100644 --- a/backends/events/ps3sdl/ps3sdl-events.cpp +++ b/backends/events/ps3sdl/ps3sdl-events.cpp @@ -60,11 +60,11 @@ bool PS3SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) switch (ev.jbutton.button) { case BTN_CROSS: // Left mouse button event.type = Common::EVENT_LBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BTN_CIRCLE: // Right mouse button event.type = Common::EVENT_RBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BTN_TRIANGLE: // Game menu event.type = Common::EVENT_KEYDOWN; @@ -98,11 +98,11 @@ bool PS3SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { switch (ev.jbutton.button) { case BTN_CROSS: // Left mouse button event.type = Common::EVENT_LBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BTN_CIRCLE: // Right mouse button event.type = Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); break; case BTN_TRIANGLE: // Game menu event.type = Common::EVENT_KEYUP; diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index 832fa36153..9f07cd6b8a 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -30,6 +30,10 @@ #include "common/config-manager.h" #include "common/textconsole.h" +#ifdef JOY_ANALOG +#include "math.h" +#endif + // FIXME move joystick defines out and replace with confile file options // we should really allow users to map any key to a joystick button #define JOY_DEADZONE 3200 @@ -175,12 +179,12 @@ void SdlEventSource::processMouseEvent(Common::Event &event, int x, int y) { } // Update the "keyboard mouse" coords - _km.x = x; - _km.y = y; + _km.x = x * _km.multiplier; + _km.y = y * _km.multiplier; } -void SdlEventSource::handleKbdMouse(Common::Event &event) { - +bool SdlEventSource::handleKbdMouse(Common::Event &event) { + // returns true if an event is generated // Skip recording of these events uint32 curTime = g_system->getMillis(true); @@ -203,63 +207,70 @@ void SdlEventSource::handleKbdMouse(Common::Event &event) { if (_km.x_down_count) { if (curTime > _km.x_down_time + _km.delay_time * 12) { if (_km.x_vel > 0) - _km.x_vel++; + _km.x_vel+=_km.multiplier; else - _km.x_vel--; + _km.x_vel-=_km.multiplier; } else if (curTime > _km.x_down_time + _km.delay_time * 8) { if (_km.x_vel > 0) - _km.x_vel = 5; + _km.x_vel = 5 * _km.multiplier; else - _km.x_vel = -5; + _km.x_vel = -5 * _km.multiplier; } } if (_km.y_down_count) { if (curTime > _km.y_down_time + _km.delay_time * 12) { if (_km.y_vel > 0) - _km.y_vel++; + _km.y_vel += _km.multiplier; else - _km.y_vel--; + _km.y_vel -= _km.multiplier; } else if (curTime > _km.y_down_time + _km.delay_time * 8) { if (_km.y_vel > 0) - _km.y_vel = 5; + _km.y_vel = 5 * _km.multiplier; else - _km.y_vel = -5; + _km.y_vel = -5 * _km.multiplier; } } - - _km.x += _km.x_vel; - _km.y += _km.y_vel; - + // The modifier key makes the mouse movement slower + if (_km.modifier) { + _km.x += _km.x_vel / 5; + _km.y += _km.y_vel / 5; + } else { + _km.x += _km.x_vel; + _km.y += _km.y_vel; + } + if (_km.x < 0) { _km.x = 0; - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; - } else if (_km.x > _km.x_max) { - _km.x = _km.x_max; - _km.x_vel = 1; + } else if (_km.x > _km.x_max * _km.multiplier) { + _km.x = _km.x_max * _km.multiplier; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } if (_km.y < 0) { _km.y = 0; - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; - } else if (_km.y > _km.y_max) { - _km.y = _km.y_max; - _km.y_vel = 1; + } else if (_km.y > _km.y_max * _km.multiplier) { + _km.y = _km.y_max * _km.multiplier; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } if (_graphicsManager) { - _graphicsManager->getWindow()->warpMouseInWindow((Uint16)_km.x, (Uint16)_km.y); + _graphicsManager->getWindow()->warpMouseInWindow((Uint16) (_km.x / _km.multiplier), (Uint16) (_km.y / _km.multiplier)); } if (_km.x != oldKmX || _km.y != oldKmY) { event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); + return true; } } } + return false; } void SdlEventSource::SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { @@ -435,8 +446,9 @@ Common::KeyCode SdlEventSource::SDLToOSystemKeycode(const SDLKey key) { } bool SdlEventSource::pollEvent(Common::Event &event) { - handleKbdMouse(event); - + if (handleKbdMouse(event)) { + return true; + } #if SDL_VERSION_ATLEAST(2, 0, 0) // In case we still need to send a key up event for a key down from a @@ -496,7 +508,7 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) { // with a mouse wheel event. However, SDL2 does not supply // these, thus we use whatever we got last time. It seems // these are always stored in _km.x, _km.y. - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); if (yDir < 0) { event.type = Common::EVENT_WHEELDOWN; return true; @@ -723,10 +735,10 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = Common::EVENT_LBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = Common::EVENT_RBUTTONDOWN; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); } else { event.type = Common::EVENT_KEYDOWN; switch (ev.jbutton.button) { @@ -754,10 +766,10 @@ bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { bool SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = Common::EVENT_LBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = Common::EVENT_RBUTTONUP; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); } else { event.type = Common::EVENT_KEYUP; switch (ev.jbutton.button) { @@ -783,7 +795,12 @@ bool SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { } bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { + int axis = ev.jaxis.value; +#ifdef JOY_ANALOG + // conversion factor between keyboard mouse and joy axis value + int vel_to_axis = (3000 / _km.multiplier); +#else if (axis > JOY_DEADZONE) { axis -= JOY_DEADZONE; event.type = Common::EVENT_MOUSEMOVE; @@ -792,14 +809,15 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_MOUSEMOVE; } else axis = 0; +#endif if (ev.jaxis.axis == JOY_XAXIS) { #ifdef JOY_ANALOG - _km.x_vel = axis / 2000; + _km.x_vel = axis / vel_to_axis; _km.x_down_count = 0; #else if (axis != 0) { - _km.x_vel = (axis > 0) ? 1:-1; + _km.x_vel = (axis > 0) ? 1 * _km.multiplier:-1 * _km.multiplier; _km.x_down_count = 1; } else { _km.x_vel = 0; @@ -811,11 +829,11 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { axis = -axis; #endif #ifdef JOY_ANALOG - _km.y_vel = -axis / 2000; + _km.y_vel = -axis / vel_to_axis; _km.y_down_count = 0; #else if (axis != 0) { - _km.y_vel = (-axis > 0) ? 1: -1; + _km.y_vel = (-axis > 0) ? 1 * _km.multiplier: -1 * _km.multiplier; _km.y_down_count = 1; } else { _km.y_vel = 0; @@ -823,8 +841,28 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { } #endif } +#ifdef JOY_ANALOG + // radial and scaled analog joystick deadzone + float analogX = (float) (_km.x_vel * vel_to_axis); + float analogY = (float) (_km.y_vel * vel_to_axis); + float deadZone = (float) JOY_DEADZONE; + float scalingFactor = 1.0f; + float magnitude = 0.0f; + + magnitude = sqrt(analogX * analogX + analogY * analogY); + + if (magnitude >= deadZone) { + scalingFactor = 1.0f / magnitude * (magnitude - deadZone) / (32769.0f - deadZone); + _km.x_vel = (int16) (analogX * scalingFactor * 32768.0f / vel_to_axis); + _km.y_vel = (int16) (analogY * scalingFactor * 32768.0f / vel_to_axis); + event.type = Common::EVENT_MOUSEMOVE; + } else { + _km.y_vel = 0; + _km.x_vel = 0; + } +#endif - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; } @@ -900,8 +938,10 @@ bool SdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { void SdlEventSource::resetKeyboardEmulation(int16 x_max, int16 y_max) { _km.x_max = x_max; _km.y_max = y_max; - _km.delay_time = 25; + _km.delay_time = 12; _km.last_time = 0; + _km.multiplier = 16; + _km.modifier = false; } bool SdlEventSource::handleResizeEvent(Common::Event &event, int w, int h) { diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h index 032ad723eb..ecbf62c464 100644 --- a/backends/events/sdl/sdl-events.h +++ b/backends/events/sdl/sdl-events.h @@ -58,8 +58,9 @@ protected: //@{ struct KbdMouse { - int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count; + int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count, multiplier; uint32 last_time, delay_time, x_down_time, y_down_time; + bool modifier; }; KbdMouse _km; @@ -106,7 +107,7 @@ protected: virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event); - virtual void handleKbdMouse(Common::Event &event); + virtual bool handleKbdMouse(Common::Event &event); //@} diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp index b0d2c25302..6f736bd45d 100644 --- a/backends/events/symbiansdl/symbiansdl-events.cpp +++ b/backends/events/symbiansdl/symbiansdl-events.cpp @@ -56,76 +56,76 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (loop) { case GUI::ACTION_UP: if (ev.type == SDL_KEYDOWN) { - _km.y_vel = -1; + _km.y_vel = -1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_DOWN: if (ev.type == SDL_KEYDOWN) { - _km.y_vel = 1; + _km.y_vel = 1 * _km.multiplier; _km.y_down_count = 1; } else { - _km.y_vel = 0; + _km.y_vel = 0 * _km.multiplier; _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_LEFT: if (ev.type == SDL_KEYDOWN) { - _km.x_vel = -1; + _km.x_vel = -1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_RIGHT: if (ev.type == SDL_KEYDOWN) { - _km.x_vel = 1; + _km.x_vel = 1 * _km.multiplier; _km.x_down_count = 1; } else { - _km.x_vel = 0; + _km.x_vel = 0 * _km.multiplier; _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_LEFTCLICK: event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP); - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_RIGHTCLICK: event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP); - processMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x / _km.multiplier, _km.y / _km.multiplier); return true; case GUI::ACTION_ZONE: if (ev.type == SDL_KEYDOWN) { for (int i = 0; i < TOTAL_ZONES; i++) - if (_km.x >= _zones[i].x && _km.y >= _zones[i].y && - _km.x <= _zones[i].x + _zones[i].width && _km.y <= _zones[i].y + _zones[i].height + if ( (_km.x / _km.multiplier) >= _zones[i].x && (_km.y / _km.multiplier) >= _zones[i].y && + (_km.x / _km.multiplier) <= _zones[i].x + _zones[i].width && (_km.y / _km.multiplier <= _zones[i].y + _zones[i].height ) { - _mouseXZone[i] = _km.x; - _mouseYZone[i] = _km.y; + _mouseXZone[i] = _km.x / _km.multiplier; + _mouseYZone[i] = _km.y / _km.multiplier; break; } _currentZone++; diff --git a/backends/events/wincesdl/wincesdl-events.cpp b/backends/events/wincesdl/wincesdl-events.cpp index 2fcd79490c..f37ee71702 100644 --- a/backends/events/wincesdl/wincesdl-events.cpp +++ b/backends/events/wincesdl/wincesdl-events.cpp @@ -48,8 +48,8 @@ void WINCESdlEventSource::processMouseEvent(Common::Event &event, int x, int y) event.mouse.y = y; // Update the "keyboard mouse" coords - _km.x = event.mouse.x; - _km.y = event.mouse.y; + _km.x = event.mouse.x * _km.multiplier; + _km.y = event.mouse.y * _km.multiplier; // Adjust for the screen scaling if (_graphicsMan->_zoomDown) @@ -69,7 +69,9 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { memset(&event, 0, sizeof(Common::Event)); - handleKbdMouse(event); + if (handleKbdMouse(event) { + return true; + } // If the screen changed, send an Common::EVENT_SCREEN_CHANGED int screenID = _graphicsMan->getScreenChangeID(); -- cgit v1.2.3