aboutsummaryrefslogtreecommitdiff
path: root/backends/events
diff options
context:
space:
mode:
authorrsn88872017-02-16 03:19:59 -0600
committerrsn88872017-02-17 17:55:09 -0600
commit613c6f4f7f3a64f857ca59e453b5e53d01e64899 (patch)
treeb43962e434d4d657e5e0140110b49b5c09ded421 /backends/events
parentc0d155db972323b87af0964f59676be091c76be6 (diff)
downloadscummvm-rg350-613c6f4f7f3a64f857ca59e453b5e53d01e64899.tar.gz
scummvm-rg350-613c6f4f7f3a64f857ca59e453b5e53d01e64899.tar.bz2
scummvm-rg350-613c6f4f7f3a64f857ca59e453b5e53d01e64899.zip
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
Diffstat (limited to 'backends/events')
-rw-r--r--backends/events/dinguxsdl/dinguxsdl-events.cpp28
-rw-r--r--backends/events/gph/gph-events.cpp74
-rw-r--r--backends/events/linuxmotosdl/linuxmotosdl-events.cpp30
-rw-r--r--backends/events/maemosdl/maemosdl-events.cpp4
-rw-r--r--backends/events/openpandora/op-events.cpp14
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.cpp8
-rw-r--r--backends/events/sdl/sdl-events.cpp118
-rw-r--r--backends/events/sdl/sdl-events.h5
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.cpp36
-rw-r--r--backends/events/wincesdl/wincesdl-events.cpp8
10 files changed, 184 insertions, 141 deletions
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();