aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2011-08-08 21:36:50 -0400
committerMatthew Hoops2011-08-08 21:36:50 -0400
commit677aa783707c566feea50608e2f0ba669037888b (patch)
tree8bed08790a96c7c25a5355a20fe00e7be30aed69
parent9c52724ce56c16c7fe1e9fdd3532d7e14b53c238 (diff)
parentdbceb0a77d64d6e16b0186417ab92c425eddb173 (diff)
downloadscummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.gz
scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.bz2
scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.zip
Merge remote branch 'upstream/master' into soccer
-rw-r--r--backends/events/dinguxsdl/dinguxsdl-events.cpp12
-rw-r--r--backends/events/gph/gph-events.cpp18
-rw-r--r--backends/events/linuxmotosdl/linuxmotosdl-events.cpp14
-rw-r--r--backends/events/openpandora/op-events.cpp12
-rw-r--r--backends/events/ps3sdl/ps3sdl-events.cpp8
-rw-r--r--backends/events/sdl/sdl-events.cpp39
-rw-r--r--backends/events/sdl/sdl-events.h13
-rw-r--r--backends/events/symbiansdl/symbiansdl-events.cpp14
-rw-r--r--backends/events/webossdl/webossdl-events.cpp12
-rw-r--r--backends/events/wincesdl/wincesdl-events.cpp16
-rw-r--r--backends/events/wincesdl/wincesdl-events.h2
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp22
-rw-r--r--backends/graphics/dinguxsdl/dinguxsdl-graphics.h2
-rw-r--r--backends/graphics/gph/gph-graphics.cpp22
-rw-r--r--backends/graphics/gph/gph-graphics.h2
-rw-r--r--backends/graphics/graphics.h4
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp22
-rw-r--r--backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h3
-rw-r--r--backends/graphics/opengl/gltexture.h15
-rw-r--r--backends/graphics/opengl/opengl-graphics.cpp39
-rw-r--r--backends/graphics/opengl/opengl-graphics.h10
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.cpp90
-rw-r--r--backends/graphics/openglsdl/openglsdl-graphics.h15
-rw-r--r--backends/graphics/sdl/sdl-graphics.cpp35
-rw-r--r--backends/graphics/sdl/sdl-graphics.h86
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.cpp56
-rw-r--r--backends/graphics/surfacesdl/surfacesdl-graphics.h11
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.cpp25
-rw-r--r--backends/graphics/wincesdl/wincesdl-graphics.h5
-rw-r--r--backends/module.mk1
-rw-r--r--backends/platform/sdl/sdl.cpp4
-rw-r--r--backends/platform/sdl/sdl.h6
-rw-r--r--base/main.cpp4
-rw-r--r--common/EventDispatcher.cpp13
-rw-r--r--common/EventRecorder.cpp77
-rw-r--r--common/EventRecorder.h2
-rw-r--r--common/events.h22
-rwxr-xr-xconfigure88
-rw-r--r--engines/agos/agos.h2
-rw-r--r--engines/sci/engine/seg_manager.cpp6
-rw-r--r--engines/scumm/he/script_v100he.cpp22
-rw-r--r--engines/scumm/he/script_v80he.cpp5
-rw-r--r--engines/scumm/he/sprite_he.cpp10
-rw-r--r--engines/scumm/input.cpp12
-rw-r--r--engines/scumm/sound.cpp4
-rw-r--r--engines/tinsel/adpcm.cpp2
46 files changed, 565 insertions, 339 deletions
diff --git a/backends/events/dinguxsdl/dinguxsdl-events.cpp b/backends/events/dinguxsdl/dinguxsdl-events.cpp
index 946507ccfd..64d8fbeb62 100644
--- a/backends/events/dinguxsdl/dinguxsdl-events.cpp
+++ b/backends/events/dinguxsdl/dinguxsdl-events.cpp
@@ -50,7 +50,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_DOWN) {
@@ -63,7 +63,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_LEFT) {
@@ -76,7 +76,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_RIGHT) {
@@ -89,7 +89,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_Y) { // left mouse button
@@ -99,7 +99,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_B) { // right mouse button
@@ -109,7 +109,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_RBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
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 b461f85fbb..ce5d892957 100644
--- a/backends/events/gph/gph-events.cpp
+++ b/backends/events/gph/gph-events.cpp
@@ -165,7 +165,7 @@ GPHEventSource::GPHEventSource()
: _buttonStateL(false){
}
-//void GPHEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
+//void GPHEventSource::processMouseEvent(Common::Event &event, int x, int y) {
// if (GPHGraphicsManager::_videoMode.mode == GFX_HALF && !GPHGraphicsManager::_overlayVisible){
// event.mouse.x = x*2;
// event.mouse.y = y*2;
@@ -260,7 +260,7 @@ bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event)
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -287,7 +287,7 @@ bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -310,16 +310,16 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
case BUTTON_UPRIGHT:
moveStick();
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_B:
case BUTTON_CLICK:
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_X:
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_L:
BUTTON_STATE_L = true;
@@ -433,16 +433,16 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
case BUTTON_UPRIGHT:
moveStick();
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_B:
case BUTTON_CLICK:
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BUTTON_X:
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
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 e859c5291b..5d9f032e19 100644
--- a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
+++ b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp
@@ -132,7 +132,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_RIGHT) {
if (ev.type == SDL_KEYDOWN) {
@@ -144,7 +144,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_DOWN) {
@@ -157,7 +157,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_UP) {
@@ -170,7 +170,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_RETURN) {
@@ -181,7 +181,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_PLUS) {
@@ -191,7 +191,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
} else {
event.type = Common::EVENT_RBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == SDLK_MINUS) {
@@ -202,7 +202,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_LBUTTONUP;
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
} else {
diff --git a/backends/events/openpandora/op-events.cpp b/backends/events/openpandora/op-events.cpp
index 72bc56c95d..56915f96fe 100644
--- a/backends/events/openpandora/op-events.cpp
+++ b/backends/events/openpandora/op-events.cpp
@@ -81,7 +81,7 @@ bool OPEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -108,7 +108,7 @@ bool OPEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -123,12 +123,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
switch (ev.key.keysym.sym) {
case SDLK_HOME:
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_END:
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_PAGEDOWN:
@@ -159,12 +159,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
switch (ev.key.keysym.sym) {
case SDLK_HOME:
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_END:
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
break;
case SDLK_PAGEDOWN:
diff --git a/backends/events/ps3sdl/ps3sdl-events.cpp b/backends/events/ps3sdl/ps3sdl-events.cpp
index eefc641844..723942af11 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;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BTN_CIRCLE: // Right mouse button
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
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;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
break;
case BTN_CIRCLE: // Right mouse button
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
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 d4f40958fe..9d235e9044 100644
--- a/backends/events/sdl/sdl-events.cpp
+++ b/backends/events/sdl/sdl-events.cpp
@@ -50,7 +50,7 @@
#define JOY_BUT_F5 5
SdlEventSource::SdlEventSource()
- : _scrollLock(false), _joystick(0), _lastScreenID(0), EventSource() {
+ : EventSource(), _scrollLock(false), _joystick(0), _lastScreenID(0), _graphicsManager(0) {
// Reset mouse state
memset(&_km, 0, sizeof(_km));
@@ -91,10 +91,15 @@ int SdlEventSource::mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
return key;
}
-void SdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
+void SdlEventSource::processMouseEvent(Common::Event &event, int x, int y) {
event.mouse.x = x;
event.mouse.y = y;
+ if (_graphicsManager) {
+ _graphicsManager->notifyMousePos(Common::Point(x, y));
+ _graphicsManager->transformMouseCoordinates(event.mouse);
+ }
+
// Update the "keyboard mouse" coords
_km.x = x;
_km.y = y;
@@ -377,16 +382,14 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
return handleJoyAxisMotion(ev, event);
case SDL_VIDEOEXPOSE:
- // HACK: Send a fake event, handled by SdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
- return true;
+ if (_graphicsManager)
+ _graphicsManager->notifyVideoExpose();
+ return false;
case SDL_VIDEORESIZE:
- // HACK: Send a fake event, handled by OpenGLSdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventResize;
- event.mouse.x = ev.resize.w;
- event.mouse.y = ev.resize.h;
- return true;
+ if (_graphicsManager)
+ _graphicsManager->notifyResize(ev.resize.w, ev.resize.h);
+ return false;
case SDL_QUIT:
event.type = Common::EVENT_QUIT;
@@ -504,7 +507,7 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) {
bool SdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) {
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, ev.motion.x, ev.motion.y);
+ processMouseEvent(event, ev.motion.x, ev.motion.y);
return true;
}
@@ -527,7 +530,7 @@ bool SdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event)
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -543,7 +546,7 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
#endif
else
return false;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
return true;
}
@@ -551,10 +554,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;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
event.type = Common::EVENT_RBUTTONDOWN;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else {
event.type = Common::EVENT_KEYDOWN;
switch (ev.jbutton.button) {
@@ -582,10 +585,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;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
} else {
event.type = Common::EVENT_KEYUP;
switch (ev.jbutton.button) {
@@ -653,7 +656,7 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
#endif
}
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
}
diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h
index 9122692a8e..2ba88c702b 100644
--- a/backends/events/sdl/sdl-events.h
+++ b/backends/events/sdl/sdl-events.h
@@ -24,6 +24,7 @@
#define BACKEND_EVENTS_SDL_H
#include "backends/platform/sdl/sdl-sys.h"
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "common/events.h"
@@ -36,6 +37,8 @@ public:
SdlEventSource();
virtual ~SdlEventSource();
+ void setGraphicsManager(SdlGraphicsManager *gMan) { _graphicsManager = gMan; }
+
/**
* Gets and processes SDL events.
*/
@@ -77,6 +80,11 @@ protected:
int _lastScreenID;
/**
+ * The associated graphics manager.
+ */
+ SdlGraphicsManager *_graphicsManager;
+
+ /**
* Pre process an event before it is dispatched.
*/
virtual void preprocessEvents(SDL_Event *event) {}
@@ -108,9 +116,10 @@ protected:
//@}
/**
- * Assigns the mouse coords to the mouse event
+ * Assigns the mouse coords to the mouse event. Furthermore notify the
+ * graphics manager about the position change.
*/
- virtual void fillMouseEvent(Common::Event &event, int x, int y);
+ virtual void processMouseEvent(Common::Event &event, int x, int y);
/**
* Remaps key events. This allows platforms to configure
diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp
index 1ffaae2ba0..308621e697 100644
--- a/backends/events/symbiansdl/symbiansdl-events.cpp
+++ b/backends/events/symbiansdl/symbiansdl-events.cpp
@@ -63,7 +63,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -76,7 +76,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -89,7 +89,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -102,19 +102,19 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
case GUI::ACTION_LEFTCLICK:
event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP);
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
case GUI::ACTION_RIGHTCLICK:
event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP);
- fillMouseEvent(event, _km.x, _km.y);
+ processMouseEvent(event, _km.x, _km.y);
return true;
@@ -132,7 +132,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) {
if (_currentZone >= TOTAL_ZONES)
_currentZone = 0;
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]);
+ processMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]);
SDL_WarpMouse(event.mouse.x, event.mouse.y);
}
diff --git a/backends/events/webossdl/webossdl-events.cpp b/backends/events/webossdl/webossdl-events.cpp
index 102eb5802e..a6a2ed3644 100644
--- a/backends/events/webossdl/webossdl-events.cpp
+++ b/backends/events/webossdl/webossdl-events.cpp
@@ -159,7 +159,7 @@ bool WebOSSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &ev
if (getMillis() - dragStartTime < 250) {
dragging = true;
event.type = Common::EVENT_LBUTTONDOWN;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
}
}
return true;
@@ -180,7 +180,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
if (dragging)
{
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
dragging = false;
return true;
}
@@ -195,7 +195,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
// left mouse click.
if (duration < 500) {
event.type = Common::EVENT_LBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
g_system->getEventManager()->pushEvent(event);
event.type = Common::EVENT_LBUTTONDOWN;
dragStartTime = getMillis();
@@ -205,7 +205,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
// right mouse click.
else if (duration < 1000) {
event.type = Common::EVENT_RBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
g_system->getEventManager()->pushEvent(event);
event.type = Common::EVENT_RBUTTONDOWN;
}
@@ -214,7 +214,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even
// middle mouse click.
else {
event.type = Common::EVENT_MBUTTONUP;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
g_system->getEventManager()->pushEvent(event);
event.type = Common::EVENT_MBUTTONDOWN;
}
@@ -240,7 +240,7 @@ bool WebOSSdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event)
dragDiffX += ev.motion.xrel;
dragDiffY += ev.motion.yrel;
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, curX, curY);
+ processMouseEvent(event, curX, curY);
}
return true;
}
diff --git a/backends/events/wincesdl/wincesdl-events.cpp b/backends/events/wincesdl/wincesdl-events.cpp
index 1116cbbb8d..e73a4e66dd 100644
--- a/backends/events/wincesdl/wincesdl-events.cpp
+++ b/backends/events/wincesdl/wincesdl-events.cpp
@@ -43,7 +43,7 @@ void WINCESdlEventSource::init(WINCESdlGraphicsManager *graphicsMan) {
_graphicsMan = graphicsMan;
}
-void WINCESdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) {
+void WINCESdlEventSource::processMouseEvent(Common::Event &event, int x, int y) {
event.mouse.x = x;
event.mouse.y = y;
@@ -153,7 +153,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
case SDL_MOUSEMOTION:
event.type = Common::EVENT_MOUSEMOVE;
- fillMouseEvent(event, ev.motion.x, ev.motion.y);
+ processMouseEvent(event, ev.motion.x, ev.motion.y);
_graphicsMan->setMousePos(event.mouse.x, event.mouse.y);
return true;
@@ -165,7 +165,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
event.type = Common::EVENT_RBUTTONDOWN;
else
break;
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
if (event.mouse.x > _tapX)
@@ -241,7 +241,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
_rbutton = false;
}
- fillMouseEvent(event, ev.button.x, ev.button.y);
+ processMouseEvent(event, ev.button.x, ev.button.y);
if (freeLookActive && !_closeClick) {
_tapX = event.mouse.x;
@@ -261,8 +261,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
return true;
case SDL_VIDEOEXPOSE:
- // HACK: Send a fake event, handled by SdlGraphicsManager
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
+ _graphicsMan->notifyVideoExpose();
break;
case SDL_QUIT:
@@ -279,9 +278,8 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) {
if (ev.active.state & SDL_APPINPUTFOCUS) {
_graphicsMan->_hasfocus = ev.active.gain;
SDL_PauseAudio(!_graphicsMan->_hasfocus);
- if (_graphicsMan->_hasfocus) {
- event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose;
- }
+ if (_graphicsMan->_hasfocus)
+ _graphicsMan->notifyVideoExpose();
}
break;
}
diff --git a/backends/events/wincesdl/wincesdl-events.h b/backends/events/wincesdl/wincesdl-events.h
index deeee6196c..5eff630c2a 100644
--- a/backends/events/wincesdl/wincesdl-events.h
+++ b/backends/events/wincesdl/wincesdl-events.h
@@ -43,7 +43,7 @@ public:
// Overloaded from SDL backend (toolbar handling)
bool pollEvent(Common::Event &event);
// Overloaded from SDL backend (mouse and new scaler handling)
- void fillMouseEvent(Common::Event &event, int x, int y);
+ void processMouseEvent(Common::Event &event, int x, int y);
protected:
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
index 8075d0d45b..2fd22c4e80 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp
@@ -510,21 +510,17 @@ void DINGUXSdlGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void DINGUXSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void DINGUXSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
index 84a784b771..ecdd01d166 100644
--- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
+++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h
@@ -57,7 +57,7 @@ public:
SurfaceSdlGraphicsManager::MousePos *getMouseCurState();
SurfaceSdlGraphicsManager::VideoState *getVideoMode();
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif /* BACKENDS_GRAPHICS_SDL_DINGUX_H */
diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp
index 82a32203fb..2e8bfa668e 100644
--- a/backends/graphics/gph/gph-graphics.cpp
+++ b/backends/graphics/gph/gph-graphics.cpp
@@ -579,21 +579,17 @@ void GPHGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void GPHGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void GPHGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/gph/gph-graphics.h b/backends/graphics/gph/gph-graphics.h
index 45b8618569..0118fc7ecd 100644
--- a/backends/graphics/gph/gph-graphics.h
+++ b/backends/graphics/gph/gph-graphics.h
@@ -56,7 +56,7 @@ public:
SurfaceSdlGraphicsManager::MousePos *getMouseCurState();
SurfaceSdlGraphicsManager::VideoState *getVideoMode();
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif /* BACKENDS_GRAPHICS_GPH_H */
diff --git a/backends/graphics/graphics.h b/backends/graphics/graphics.h
index 20924ed581..3f282df587 100644
--- a/backends/graphics/graphics.h
+++ b/backends/graphics/graphics.h
@@ -84,6 +84,10 @@ public:
virtual void setCursorPalette(const byte *colors, uint start, uint num) = 0;
virtual void displayMessageOnOSD(const char *msg) {}
+
+ // Graphics::PaletteManager interface
+ //virtual void setPalette(const byte *colors, uint start, uint num) = 0;
+ //virtual void grabPalette(byte *colors, uint start, uint num) = 0;
};
#endif
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
index 732074b7e2..e59d3f975b 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp
@@ -478,21 +478,17 @@ void LinuxmotoSdlGraphicsManager::warpMouse(int x, int y) {
SurfaceSdlGraphicsManager::warpMouse(x, y);
}
-void LinuxmotoSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- if (_videoMode.mode == GFX_HALF) {
- newEvent.mouse.x *= 2;
- newEvent.mouse.y *= 2;
- }
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
+void LinuxmotoSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ if (_videoMode.mode == GFX_HALF) {
+ point.x *= 2;
+ point.y *= 2;
}
g_system->getEventManager()->pushEvent(newEvent);
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
}
diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
index 938512f323..ee2a566d71 100644
--- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
+++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h
@@ -42,8 +42,7 @@ public:
virtual void hideOverlay();
virtual void warpMouse(int x, int y);
-protected:
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
};
#endif
diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h
index f0cd7aed56..2f0bef2bbf 100644
--- a/backends/graphics/opengl/gltexture.h
+++ b/backends/graphics/opengl/gltexture.h
@@ -20,6 +20,9 @@
*
*/
+#ifndef BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
+#define BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H
+
#include "common/scummsys.h"
#ifdef WIN32
@@ -31,6 +34,16 @@
#undef ARRAYSIZE
#endif
+// HACK: At this point in Windows platforms, common/util.h has been included
+// via common/rect.h (from backends/graphics/sdl/sdl-graphics.h), via
+// backends/graphics/openglsdl/openglsdl-graphics.h. Thus, we end up with
+// COMMON_UTIL_H defined, and ARRAYSIZE undefined (bad!). Therefore,
+// ARRAYSIZE is undefined in openglsdl-graphics.cpp. This is a temporary
+// hackish solution fo fix compilation under Windows.
+#if !defined(ARRAYSIZE) && defined(COMMON_UTIL_H)
+#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0])))
+#endif
+
#if defined(USE_GLES)
#include <GLES/gl.h>
#elif defined(SDL_BACKEND)
@@ -106,3 +119,5 @@ protected:
GLint _filter;
bool _refresh;
};
+
+#endif
diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index 046be4c669..57c2378649 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -67,10 +67,6 @@ OpenGLGraphicsManager::OpenGLGraphicsManager()
}
OpenGLGraphicsManager::~OpenGLGraphicsManager() {
- // Unregister the event observer
- if (g_system->getEventManager()->getEventDispatcher() != NULL)
- g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
-
free(_gamePalette);
free(_cursorPalette);
@@ -79,11 +75,6 @@ OpenGLGraphicsManager::~OpenGLGraphicsManager() {
delete _cursorTexture;
}
-void OpenGLGraphicsManager::initEventObserver() {
- // Register the graphics manager as a event observer
- g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
-}
-
//
// Feature
//
@@ -1282,36 +1273,6 @@ void OpenGLGraphicsManager::adjustMousePosition(int16 &x, int16 &y) {
}
}
-bool OpenGLGraphicsManager::notifyEvent(const Common::Event &event) {
- switch (event.type) {
- case Common::EVENT_MOUSEMOVE:
- if (!event.synthetic) {
- _cursorState.x = event.mouse.x;
- _cursorState.y = event.mouse.y;
- }
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- case Common::EVENT_WHEELUP:
- case Common::EVENT_WHEELDOWN:
- case Common::EVENT_MBUTTONDOWN:
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- case Common::EVENT_MBUTTONUP:
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- adjustMousePosition(newEvent.mouse.x, newEvent.mouse.y);
- g_system->getEventManager()->pushEvent(newEvent);
- }
- return !event.synthetic;
-
- default:
- break;
- }
-
- return false;
-}
-
bool OpenGLGraphicsManager::saveScreenshot(const char *filename) {
int width = _videoMode.hardwareWidth;
int height = _videoMode.hardwareHeight;
diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h
index 56f7d92a12..8a110b2d5f 100644
--- a/backends/graphics/opengl/opengl-graphics.h
+++ b/backends/graphics/opengl/opengl-graphics.h
@@ -26,7 +26,7 @@
#include "backends/graphics/opengl/gltexture.h"
#include "backends/graphics/graphics.h"
#include "common/array.h"
-#include "common/events.h"
+#include "common/rect.h"
#include "graphics/pixelformat.h"
// Uncomment this to enable the 'on screen display' code.
@@ -50,13 +50,11 @@ enum {
* the buffers swap, and implement loadGFXMode for handling the window/context if
* needed. If USE_RGB_COLOR is enabled, getSupportedFormats must be implemented.
*/
-class OpenGLGraphicsManager : public GraphicsManager, public Common::EventObserver {
+class OpenGLGraphicsManager : public GraphicsManager {
public:
OpenGLGraphicsManager();
virtual ~OpenGLGraphicsManager();
- virtual void initEventObserver();
-
virtual bool hasFeature(OSystem::Feature f);
virtual void setFeatureState(OSystem::Feature f, bool enable);
virtual bool getFeatureState(OSystem::Feature f);
@@ -109,10 +107,6 @@ public:
virtual void setCursorPalette(const byte *colors, uint start, uint num);
virtual void displayMessageOnOSD(const char *msg);
-
- // Override from Common::EventObserver
- bool notifyEvent(const Common::Event &event);
-
protected:
/**
* Setup OpenGL settings
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp
index bd7dd32e3b..8ea95768df 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.cpp
+++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp
@@ -30,8 +30,9 @@
#include "common/textconsole.h"
#include "common/translation.h"
-OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager()
+OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *eventSource)
:
+ SdlGraphicsManager(eventSource),
_hwscreen(0),
_screenResized(false),
_activeFullscreenMode(-2),
@@ -71,6 +72,14 @@ OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager()
}
OpenGLSdlGraphicsManager::~OpenGLSdlGraphicsManager() {
+ // Unregister the event observer
+ if (g_system->getEventManager()->getEventDispatcher() != NULL)
+ g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
+}
+
+void OpenGLSdlGraphicsManager::initEventObserver() {
+ // Register the graphics manager as a event observer
+ g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false);
}
bool OpenGLSdlGraphicsManager::hasFeature(OSystem::Feature f) {
@@ -609,50 +618,61 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) {
}
}
break;
+
case Common::EVENT_KEYUP:
return isHotkey(event);
- // HACK: Handle special SDL event
- // The new screen size is saved on the mouse event as part of HACK,
- // there is no common resize event.
- case OSystem_SDL::kSdlEventResize:
- // Do not resize if ignoring resize events.
- if (!_ignoreResizeFrames && !getFullscreenMode()) {
- bool scaleChanged = false;
- beginGFXTransaction();
- _videoMode.hardwareWidth = event.mouse.x;
- _videoMode.hardwareHeight = event.mouse.y;
-
- if (_videoMode.mode != OpenGL::GFX_ORIGINAL) {
- _screenResized = true;
- calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
- }
- int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth,
- _videoMode.hardwareHeight / _videoMode.screenHeight);
+ default:
+ break;
+ }
- if (getScale() != scale) {
- scaleChanged = true;
- setScale(MAX(MIN(scale, 3), 1));
- }
+ return false;
+}
- if (_videoMode.mode == OpenGL::GFX_ORIGINAL) {
- calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
- }
+void OpenGLSdlGraphicsManager::notifyVideoExpose() {
+}
+
+void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) {
+ // Do not resize if ignoring resize events.
+ if (!_ignoreResizeFrames && !getFullscreenMode()) {
+ bool scaleChanged = false;
+ beginGFXTransaction();
+ _videoMode.hardwareWidth = width;
+ _videoMode.hardwareHeight = height;
+
+ if (_videoMode.mode != OpenGL::GFX_ORIGINAL) {
+ _screenResized = true;
+ calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
+ }
+
+ int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth,
+ _videoMode.hardwareHeight / _videoMode.screenHeight);
+
+ if (getScale() != scale) {
+ scaleChanged = true;
+ setScale(MAX(MIN(scale, 3), 1));
+ }
- _transactionDetails.sizeChanged = true;
- endGFXTransaction();
+ if (_videoMode.mode == OpenGL::GFX_ORIGINAL) {
+ calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight);
+ }
+
+ _transactionDetails.sizeChanged = true;
+ endGFXTransaction();
#ifdef USE_OSD
- if (scaleChanged)
- displayScaleChangedMsg();
+ if (scaleChanged)
+ displayScaleChangedMsg();
#endif
- }
- return true;
-
- default:
- break;
}
+}
- return OpenGLGraphicsManager::notifyEvent(event);
+void OpenGLSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ adjustMousePosition(point.x, point.y);
+}
+
+void OpenGLSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
+ _cursorState.x = mouse.x;
+ _cursorState.y = mouse.y;
}
#endif
diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h
index ba9f94db2d..1587183328 100644
--- a/backends/graphics/openglsdl/openglsdl-graphics.h
+++ b/backends/graphics/openglsdl/openglsdl-graphics.h
@@ -27,15 +27,17 @@
#if defined(ARRAYSIZE) && !defined(_WINDOWS_)
#undef ARRAYSIZE
#endif
-
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "backends/graphics/opengl/opengl-graphics.h"
+#include "common/events.h"
+
/**
* SDL OpenGL graphics manager
*/
-class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager {
+class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
public:
- OpenGLSdlGraphicsManager();
+ OpenGLSdlGraphicsManager(SdlEventSource *eventSource);
virtual ~OpenGLSdlGraphicsManager();
virtual bool hasFeature(OSystem::Feature f);
@@ -45,10 +47,17 @@ public:
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
#endif
+ virtual void initEventObserver();
virtual bool notifyEvent(const Common::Event &event);
virtual void updateScreen();
+ // SdlGraphicsManager interface
+ virtual void notifyVideoExpose();
+ virtual void notifyResize(const uint width, const uint height);
+ virtual void transformMouseCoordinates(Common::Point &point);
+ virtual void notifyMousePos(Common::Point mouse);
+
protected:
virtual void internUpdateScreen();
diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp
new file mode 100644
index 0000000000..2eca4b8aab
--- /dev/null
+++ b/backends/graphics/sdl/sdl-graphics.cpp
@@ -0,0 +1,35 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "backends/graphics/sdl/sdl-graphics.h"
+
+#include "backends/events/sdl/sdl-events.h"
+
+SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source)
+ : _eventSource(source) {
+ _eventSource->setGraphicsManager(this);
+}
+
+SdlGraphicsManager::~SdlGraphicsManager() {
+ _eventSource->setGraphicsManager(0);
+}
+
diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h
new file mode 100644
index 0000000000..b42eafdaa5
--- /dev/null
+++ b/backends/graphics/sdl/sdl-graphics.h
@@ -0,0 +1,86 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
+#define BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H
+
+#include "common/rect.h"
+
+class SdlEventSource;
+
+/**
+ * Base class for a SDL based graphics manager.
+ *
+ * It features a few extra a few extra features required by SdlEventSource.
+ * FIXME/HACK:
+ * Note it does not inherit from GraphicsManager to avoid a diamon inheritance
+ * in the current OpenGLSdlGraphicsManager.
+ */
+class SdlGraphicsManager {
+public:
+ SdlGraphicsManager(SdlEventSource *source);
+ virtual ~SdlGraphicsManager();
+
+ /**
+ * Notify the graphics manager that the graphics needs to be redrawn, since
+ * the application window was modified.
+ *
+ * This is basically called when SDL_VIDEOEXPOSE was received.
+ */
+ virtual void notifyVideoExpose() = 0;
+
+ /**
+ * Notify the graphics manager about an resize event.
+ *
+ * It is noteworthy that the requested width/height should actually be set
+ * up as is and not changed by the graphics manager, since else it might
+ * lead to odd behavior for certain window managers.
+ *
+ * It is only required to overwrite this method in case you want a
+ * resizable window. The default implementation just does nothing.
+ *
+ * @param width Requested window width.
+ * @param height Requested window height.
+ */
+ virtual void notifyResize(const uint width, const uint height) {}
+
+ /**
+ * Transforms real screen coordinates into the current active screen
+ * coordinates (may be either game screen or overlay).
+ *
+ * @param point Mouse coordinates to transform.
+ */
+ virtual void transformMouseCoordinates(Common::Point &point) = 0;
+
+ /**
+ * Notifies the graphics manager about a position change according to the
+ * real screen coordinates.
+ *
+ * @param mouse Mouse position.
+ */
+ virtual void notifyMousePos(Common::Point mouse) = 0;
+
+protected:
+ SdlEventSource *_eventSource;
+};
+
+#endif
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
index 2d41ecead4..81c439e7e2 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp
@@ -122,7 +122,7 @@ static AspectRatio getDesiredAspectRatio() {
SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource)
:
- _sdlEventSource(sdlEventSource),
+ SdlGraphicsManager(sdlEventSource),
#ifdef USE_OSD
_osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0),
#endif
@@ -846,7 +846,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() {
SDL_SetColorKey(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kOSDColorKey);
#endif
- _sdlEventSource->resetKeyboadEmulation(
+ _eventSource->resetKeyboadEmulation(
_videoMode.screenWidth * _videoMode.scaleFactor - 1,
effectiveScreenHeight() - 1);
@@ -2235,20 +2235,6 @@ bool SurfaceSdlGraphicsManager::isScalerHotkey(const Common::Event &event) {
return false;
}
-void SurfaceSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- if (!_overlayVisible) {
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
- }
- g_system->getEventManager()->pushEvent(newEvent);
- }
-}
-
void SurfaceSdlGraphicsManager::toggleFullScreen() {
beginGFXTransaction();
setFullscreenMode(!_videoMode.fullscreen);
@@ -2297,26 +2283,10 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) {
if (handleScalerHotkeys(event.kbd.keycode))
return true;
}
+
case Common::EVENT_KEYUP:
return isScalerHotkey(event);
- case Common::EVENT_MOUSEMOVE:
- if (event.synthetic)
- setMousePos(event.mouse.x, event.mouse.y);
- case Common::EVENT_LBUTTONDOWN:
- case Common::EVENT_RBUTTONDOWN:
- case Common::EVENT_WHEELUP:
- case Common::EVENT_WHEELDOWN:
- case Common::EVENT_MBUTTONDOWN:
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_RBUTTONUP:
- case Common::EVENT_MBUTTONUP:
- adjustMouseEvent(event);
- return !event.synthetic;
-
- // HACK: Handle special SDL event
- case OSystem_SDL::kSdlEventExpose:
- _forceFull = true;
- return false;
+
default:
break;
}
@@ -2324,4 +2294,22 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) {
return false;
}
+void SurfaceSdlGraphicsManager::notifyVideoExpose() {
+ _forceFull = true;
+}
+
+void SurfaceSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ if (!_overlayVisible) {
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
+ }
+}
+
+void SurfaceSdlGraphicsManager::notifyMousePos(Common::Point mouse) {
+ transformMouseCoordinates(mouse);
+ setMousePos(mouse.x, mouse.y);
+}
+
#endif
diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h
index cd8710d443..f71096d43e 100644
--- a/backends/graphics/surfacesdl/surfacesdl-graphics.h
+++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h
@@ -24,6 +24,7 @@
#define BACKENDS_GRAPHICS_SURFACESDL_GRAPHICS_H
#include "backends/graphics/graphics.h"
+#include "backends/graphics/sdl/sdl-graphics.h"
#include "graphics/pixelformat.h"
#include "graphics/scaler.h"
#include "common/events.h"
@@ -74,7 +75,7 @@ public:
/**
* SDL graphics manager
*/
-class SurfaceSdlGraphicsManager : public GraphicsManager, public Common::EventObserver {
+class SurfaceSdlGraphicsManager : public GraphicsManager, public SdlGraphicsManager, public Common::EventObserver {
public:
SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource);
virtual ~SurfaceSdlGraphicsManager();
@@ -140,9 +141,12 @@ public:
// Override from Common::EventObserver
bool notifyEvent(const Common::Event &event);
-protected:
- SdlEventSource *_sdlEventSource;
+ // SdlGraphicsManager interface
+ virtual void notifyVideoExpose();
+ virtual void transformMouseCoordinates(Common::Point &point);
+ virtual void notifyMousePos(Common::Point mouse);
+protected:
#ifdef USE_OSD
/** Surface containing the OSD message */
SDL_Surface *_osdSurface;
@@ -329,7 +333,6 @@ protected:
virtual bool handleScalerHotkeys(Common::KeyCode key);
virtual bool isScalerHotkey(const Common::Event &event);
- virtual void adjustMouseEvent(const Common::Event &event);
virtual void setMousePos(int x, int y);
virtual void toggleFullScreen();
virtual bool saveScreenshot(const char *filename);
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.cpp b/backends/graphics/wincesdl/wincesdl-graphics.cpp
index b1b4d4cbe7..b0cbb872b0 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.cpp
+++ b/backends/graphics/wincesdl/wincesdl-graphics.cpp
@@ -1158,22 +1158,17 @@ void WINCESdlGraphicsManager::setMouseCursor(const byte *buf, uint w, uint h, in
}
}
-void WINCESdlGraphicsManager::adjustMouseEvent(const Common::Event &event) {
- if (!event.synthetic) {
- Common::Event newEvent(event);
- newEvent.synthetic = true;
- /*
- if (!_overlayVisible) {
- newEvent.mouse.x = newEvent.mouse.x * _scaleFactorXd / _scaleFactorXm;
- newEvent.mouse.y = newEvent.mouse.y * _scaleFactorYd / _scaleFactorYm;
- newEvent.mouse.x /= _videoMode.scaleFactor;
- newEvent.mouse.y /= _videoMode.scaleFactor;
- if (_videoMode.aspectRatioCorrection)
- newEvent.mouse.y = aspect2Real(newEvent.mouse.y);
- }
- */
- g_system->getEventManager()->pushEvent(newEvent);
+void WINCESdlGraphicsManager::transformMouseCoordinates(Common::Point &point) {
+ /*
+ if (!_overlayVisible) {
+ point.x = point.x * _scaleFactorXd / _scaleFactorXm;
+ point.y = point.y * _scaleFactorYd / _scaleFactorYm;
+ point.x /= _videoMode.scaleFactor;
+ point.y /= _videoMode.scaleFactor;
+ if (_videoMode.aspectRatioCorrection)
+ point.y = aspect2Real(point.y);
}
+ */
}
void WINCESdlGraphicsManager::setMousePos(int x, int y) {
diff --git a/backends/graphics/wincesdl/wincesdl-graphics.h b/backends/graphics/wincesdl/wincesdl-graphics.h
index c9fc145194..edf3cc5769 100644
--- a/backends/graphics/wincesdl/wincesdl-graphics.h
+++ b/backends/graphics/wincesdl/wincesdl-graphics.h
@@ -158,8 +158,9 @@ public:
static zoneDesc _zones[TOTAL_ZONES];
-protected:
- virtual void adjustMouseEvent(const Common::Event &event);
+ virtual void transformMouseCoordinates(Common::Point &point);
+
+ virtual void transformMouseCoordinates(Common::Point &point);
private:
bool update_scalers();
diff --git a/backends/module.mk b/backends/module.mk
index 0e944262f5..7a8aab8b6a 100644
--- a/backends/module.mk
+++ b/backends/module.mk
@@ -61,6 +61,7 @@ endif
ifdef SDL_BACKEND
MODULE_OBJS += \
events/sdl/sdl-events.o \
+ graphics/sdl/sdl-graphics.o \
graphics/surfacesdl/surfacesdl-graphics.o \
mixer/doublebuffersdl/doublebuffersdl-mixer.o \
mixer/sdl/sdl-mixer.o \
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index e72b95bdc1..63871f5034 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -174,7 +174,7 @@ void OSystem_SDL::initBackend() {
// If the gfx_mode is from OpenGL, create the OpenGL graphics manager
if (use_opengl) {
- _graphicsManager = new OpenGLSdlGraphicsManager();
+ _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource);
graphicsManagerType = 1;
}
}
@@ -538,7 +538,7 @@ bool OSystem_SDL::setGraphicsMode(int mode) {
} else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) {
debug(1, "switching to OpenGL graphics");
delete _graphicsManager;
- _graphicsManager = new OpenGLSdlGraphicsManager();
+ _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource);
((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver();
_graphicsManager->beginGFXTransaction();
}
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index 395b2b3aac..22d79dbfe7 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -74,12 +74,6 @@ public:
virtual void getTimeAndDate(TimeDate &td) const;
virtual Audio::Mixer *getMixer();
- // HACK: Special SDL events types
- enum SdlEvent {
- kSdlEventExpose = 100,
- kSdlEventResize = 101
- };
-
protected:
bool _inited;
bool _initedSDL;
diff --git a/base/main.cpp b/base/main.cpp
index 717ccb3344..780015d307 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -419,6 +419,10 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {
// Try to run the game
Common::Error result = runGame(plugin, system, specialDebug);
+ // Flush Event recorder file. The recorder does not get reinitialized for next game
+ // which is intentional. Only single game per session is allowed.
+ g_eventRec.deinit();
+
#if defined(UNCACHED_PLUGINS) && defined(DYNAMIC_MODULES)
// do our best to prevent fragmentation by unloading as soon as we can
PluginManager::instance().unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL, false);
diff --git a/common/EventDispatcher.cpp b/common/EventDispatcher.cpp
index ce1ef0c1c8..4e3f671cfd 100644
--- a/common/EventDispatcher.cpp
+++ b/common/EventDispatcher.cpp
@@ -45,6 +45,8 @@ EventDispatcher::~EventDispatcher() {
void EventDispatcher::dispatch() {
Event event;
+ dispatchPoll();
+
for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) {
const bool allowMapping = i->source->allowMapping();
@@ -94,12 +96,13 @@ void EventDispatcher::unregisterSource(EventSource *source) {
}
}
-void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree) {
+void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree, bool notifyPoll) {
ObserverEntry newEntry;
newEntry.observer = obs;
newEntry.priority = priority;
newEntry.autoFree = autoFree;
+ newEntry.poll = notifyPoll;
for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
if (i->priority < priority) {
@@ -130,4 +133,12 @@ void EventDispatcher::dispatchEvent(const Event &event) {
}
}
+void EventDispatcher::dispatchPoll() {
+ for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) {
+ if (i->poll == true)
+ if (i->observer->notifyPoll())
+ break;
+ }
+}
+
} // End of namespace Common
diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp
index 201043f52e..cf3c8b391f 100644
--- a/common/EventRecorder.cpp
+++ b/common/EventRecorder.cpp
@@ -34,7 +34,28 @@ DECLARE_SINGLETON(EventRecorder);
#define RECORD_SIGNATURE 0x54455354
#define RECORD_VERSION 1
-void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
+uint32 readTime(ReadStream *inFile) {
+ uint32 d = inFile->readByte();
+ if (d == 0xff) {
+ d = inFile->readUint32LE();
+ }
+
+ return d;
+}
+
+void writeTime(WriteStream *outFile, uint32 d) {
+ //Simple RLE compression
+ if (d >= 0xff) {
+ outFile->writeByte(0xff);
+ outFile->writeUint32LE(d);
+ } else {
+ outFile->writeByte(d);
+ }
+}
+
+void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event, uint32 &millis) {
+ millis = readTime(inFile);
+
diff = inFile->readUint32LE();
event.type = (EventType)inFile->readUint32LE();
@@ -53,6 +74,8 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
event.mouse.x = inFile->readSint16LE();
event.mouse.y = inFile->readSint16LE();
break;
@@ -61,7 +84,9 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
}
}
-void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
+void writeRecord(WriteStream *outFile, uint32 diff, const Event &event, uint32 millis) {
+ writeTime(outFile, millis);
+
outFile->writeUint32LE(diff);
outFile->writeUint32LE((uint32)event.type);
@@ -80,6 +105,8 @@ void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
outFile->writeSint16LE(event.mouse.x);
outFile->writeSint16LE(event.mouse.y);
break;
@@ -99,6 +126,7 @@ EventRecorder::EventRecorder() {
_eventCount = 0;
_lastEventCount = 0;
_lastMillis = 0;
+ _lastEventMillis = 0;
_recordMode = kPassthrough;
}
@@ -111,11 +139,15 @@ void EventRecorder::init() {
String recordModeString = ConfMan.get("record_mode");
if (recordModeString.compareToIgnoreCase("record") == 0) {
_recordMode = kRecorderRecord;
+
+ debug(3, "EventRecorder: record");
} else {
if (recordModeString.compareToIgnoreCase("playback") == 0) {
_recordMode = kRecorderPlayback;
+ debug(3, "EventRecorder: playback");
} else {
_recordMode = kPassthrough;
+ debug(3, "EventRecorder: passthrough");
}
}
@@ -173,6 +205,7 @@ void EventRecorder::init() {
_recordCount = _playbackFile->readUint32LE();
_recordTimeCount = _playbackFile->readUint32LE();
+
randomSourceCount = _playbackFile->readUint32LE();
for (uint i = 0; i < randomSourceCount; ++i) {
RandomSourceRecord rec;
@@ -190,10 +223,12 @@ void EventRecorder::init() {
}
g_system->getEventManager()->getEventDispatcher()->registerSource(this, false);
- g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false);
+ g_system->getEventManager()->getEventDispatcher()->registerObserver(this, EventManager::kEventRecorderPriority, false, true);
}
void EventRecorder::deinit() {
+ debug(3, "EventRecorder: deinit");
+
g_system->getEventManager()->getEventDispatcher()->unregisterSource(this);
g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
@@ -236,8 +271,9 @@ void EventRecorder::deinit() {
for (uint i = 0; i < _recordCount; ++i) {
uint32 tempDiff;
Event tempEvent;
- readRecord(_playbackFile, tempDiff, tempEvent);
- writeRecord(_recordFile, tempDiff, tempEvent);
+ uint32 millis;
+ readRecord(_playbackFile, tempDiff, tempEvent, millis);
+ writeRecord(_recordFile, tempDiff, tempEvent, millis);
}
_recordFile->finalize();
@@ -278,23 +314,16 @@ void EventRecorder::processMillis(uint32 &millis) {
g_system->lockMutex(_timeMutex);
if (_recordMode == kRecorderRecord) {
- //Simple RLE compression
d = millis - _lastMillis;
- if (d >= 0xff) {
- _recordTimeFile->writeByte(0xff);
- _recordTimeFile->writeUint32LE(d);
- } else {
- _recordTimeFile->writeByte(d);
- }
+ writeTime(_recordTimeFile, d);
+
_recordTimeCount++;
}
if (_recordMode == kRecorderPlayback) {
if (_recordTimeCount > _playbackTimeCount) {
- d = _playbackTimeFile->readByte();
- if (d == 0xff) {
- d = _playbackTimeFile->readUint32LE();
- }
+ d = readTime(_playbackTimeFile);
+
millis = _lastMillis + d;
_playbackTimeCount++;
}
@@ -315,15 +344,27 @@ bool EventRecorder::notifyEvent(const Event &ev) {
StackLock lock(_recorderMutex);
++_eventCount;
- writeRecord(_recordFile, _eventCount - _lastEventCount, ev);
+ writeRecord(_recordFile, _eventCount - _lastEventCount, ev, _lastMillis - _lastEventMillis);
_recordCount++;
_lastEventCount = _eventCount;
+ _lastEventMillis = _lastMillis;
+
+ return false;
+}
+
+bool EventRecorder::notifyPoll() {
+ if (_recordMode != kRecorderRecord)
+ return false;
+
+ ++_eventCount;
return false;
}
bool EventRecorder::pollEvent(Event &ev) {
+ uint32 millis;
+
if (_recordMode != kRecorderPlayback)
return false;
@@ -332,7 +373,7 @@ bool EventRecorder::pollEvent(Event &ev) {
if (!_hasPlaybackEvent) {
if (_recordCount > _playbackCount) {
- readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent);
+ readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent, millis);
_playbackCount++;
_hasPlaybackEvent = true;
}
diff --git a/common/EventRecorder.h b/common/EventRecorder.h
index e20419695a..43a08b08cd 100644
--- a/common/EventRecorder.h
+++ b/common/EventRecorder.h
@@ -61,6 +61,7 @@ public:
private:
bool notifyEvent(const Event &ev);
+ bool notifyPoll();
bool pollEvent(Event &ev);
bool allowMapping() const { return false; }
@@ -75,6 +76,7 @@ private:
volatile uint32 _recordCount;
volatile uint32 _lastRecordEvent;
volatile uint32 _recordTimeCount;
+ volatile uint32 _lastEventMillis;
WriteStream *_recordFile;
WriteStream *_recordTimeFile;
MutexRef _timeMutex;
diff --git a/common/events.h b/common/events.h
index 7df2731687..f5ace7481b 100644
--- a/common/events.h
+++ b/common/events.h
@@ -184,6 +184,14 @@ public:
* false otherwise.
*/
virtual bool notifyEvent(const Event &event) = 0;
+
+ /**
+ * Notifies the observer of pollEvent() query.
+ *
+ * @return true if the event should not be passed to other observers,
+ * false otherwise.
+ */
+ virtual bool notifyPoll() { return false; }
};
/**
@@ -255,8 +263,11 @@ public:
/**
* Registers a new EventObserver with the Dispatcher.
+ *
+ * @param listenPools if set, then all pollEvent() calls are passed to observer
+ * currently it is used by keyMapper
*/
- void registerObserver(EventObserver *obs, uint priority, bool autoFree);
+ void registerObserver(EventObserver *obs, uint priority, bool autoFree, bool listenPolls = false);
/**
* Unregisters a EventObserver.
@@ -280,11 +291,13 @@ private:
struct ObserverEntry : public Entry {
uint priority;
EventObserver *observer;
+ bool poll;
};
List<ObserverEntry> _observers;
void dispatchEvent(const Event &event);
+ void dispatchPoll();
};
class Keymapper;
@@ -370,7 +383,12 @@ public:
* Priority of the event manager, for now it's lowest since it eats
* *all* events, we might to change that in the future though.
*/
- kEventManPriority = 0
+ kEventManPriority = 0,
+ /**
+ * Priority of the event recorder. It has to go after event manager
+ * in order to record events generated by it
+ */
+ kEventRecorderPriority = 1
};
/**
diff --git a/configure b/configure
index 3f02e267cd..41166d25ab 100755
--- a/configure
+++ b/configure
@@ -193,7 +193,6 @@ _posix=no
_endian=unknown
_need_memalign=yes
_have_x86=no
-_arm_asm=no
@@ -1157,12 +1156,12 @@ ps3)
_host_os=ps3
_host_cpu=ppc
_host_alias=powerpc64-ps3-elf
-
+
# The prefix is always the same on PS3 so we hardcode the default
# here. It is still possible to define a custom prefix which is
# needed when packaging the app with a user-specific app ID.
test "x$prefix" = xNONE && prefix=/dev_hdd0/game/SCUM12000/USRDIR
- # PS3 apps are installed into app-specific directories. The
+ # PS3 apps are installed into app-specific directories. The
# default directory structure of ScummVM makes no sense here so we
# hardcode PS3 specific directories here.
datarootdir='${prefix}/data'
@@ -1187,7 +1186,7 @@ webos)
# here. It is still possible to define a custom prefix which is
# needed when packaging the app with a user-specific app ID.
test "x$prefix" = xNONE && prefix=/media/cryptofs/apps/usr/palm/applications/org.scummvm.scummvm
- # WebOS apps are installed into app-specific directories. The
+ # WebOS apps are installed into app-specific directories. The
# default directory structure of ScummVM makes no sense here so we
# hardcode WebOS specific directories here.
datarootdir='${prefix}/data'
@@ -1686,38 +1685,40 @@ echo "$_need_memalign"
define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT'
#
-# Check whether we can use x86 asm routines
+# Check the CPU architecture
#
-echo_n "Compiling for x86... "
+echo_n "Checking host CPU architecture... "
case $_host_cpu in
- i386|i486|i586|i686)
+ arm*)
+ echo "ARM"
+ define_in_config_if_yes yes 'USE_ARM_SCALER_ASM'
+ define_in_config_if_yes yes 'USE_ARM_SOUND_ASM'
+ define_in_config_if_yes yes 'USE_ARM_SMUSH_ASM'
+ define_in_config_if_yes yes 'USE_ARM_GFX_ASM'
+ define_in_config_if_yes yes 'USE_ARM_COSTUME_ASM'
+
+ DEFINES="$DEFINES -DARM_TARGET"
+ ;;
+ i[3-6]86)
+ echo "x86"
_have_x86=yes
+ define_in_config_h_if_yes $_have_x86 'HAVE_X86'
;;
- *)
- _have_x86=no
+ mips*)
+ echo "MIPS"
+ DEFINES="$DEFINES -DMIPS_TARGET"
;;
-esac
-echo "$_have_x86"
-define_in_config_h_if_yes $_have_x86 'HAVE_X86'
-
-#
-# Check whether to use optimized ARM asm
-#
-echo_n "Compiling for ARM... "
-case $_host_cpu in
- arm*)
- _arm_asm=yes
+ ppc*)
+ echo "PowerPC"
+ DEFINES="$DEFINES -DPPC_TARGET"
+ ;;
+ x86_64)
+ echo "x86_64"
;;
*)
- _arm_asm=no
+ echo "unknown ($_host_cpu)"
;;
esac
-echo "$_arm_asm"
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM'
-define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM'
#
@@ -1901,7 +1902,7 @@ case $_host_os in
ps3)
# Force use of SDL from the ps3 toolchain
_sdlpath="$PS3DEV/portlibs/ppu:$PS3DEV/portlibs/ppu/bin"
-
+
DEFINES="$DEFINES -DPLAYSTATION3"
CXXFLAGS="$CXXFLAGS -mcpu=cell -mminimal-toc -I$PS3DEV/psl1ght/ppu/include -I$PS3DEV/portlibs/ppu/include"
LDFLAGS="$LDFLAGS -L$PS3DEV/psl1ght/ppu/lib -L$PS3DEV/portlibs/ppu/lib"
@@ -2097,7 +2098,7 @@ if test -n "$_host"; then
;;
gp2x)
# This uses the GPH backend.
- DEFINES="$DEFINES -DGPH_DEVICE"
+ DEFINES="$DEFINES -DGPH_DEVICE"
DEFINES="$DEFINES -DGP2X"
DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE"
if test "$_debug_build" = yes; then
@@ -2580,7 +2581,9 @@ POST_OBJS_FLAGS := -Wl,--no-whole-archive
;;
ds)
_elf_loader=yes
- DEFINES="$DEFINES -DARM_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS -DELF_NO_MEM_MANAGER"
+ DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DELF_NO_MEM_MANAGER"
_mak_plugins='
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/ds/plugin.ld -mthumb-interwork -mno-fpu
'
@@ -2598,7 +2601,8 @@ POST_OBJS_FLAGS := -Wl,-no-whole-archive
;;
gamecube | wii)
_elf_loader=yes
- DEFINES="$DEFINES -DPPC_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
_mak_plugins='
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/wii/plugin.ld
'
@@ -2651,7 +2655,6 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im
;;
ps2)
_elf_loader=yes
- DEFINES="$DEFINES -DMIPS_TARGET"
_mak_plugins='
LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld
PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc
@@ -2659,7 +2662,7 @@ PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backend
;;
psp)
_elf_loader=yes
- DEFINES="$DEFINES -DMIPS_TARGET -DUNCACHED_PLUGINS"
+ DEFINES="$DEFINES -DUNCACHED_PLUGINS"
_mak_plugins='
LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/main_prog.ld
PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/plugin.ld -lstdc++ -lc
@@ -3437,7 +3440,7 @@ case $_backend in
LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM"
;;
n64)
- # Move some libs down here, otherwise some symbols requires by libvorbis aren't found
+ # Move some libs down here, otherwise some symbols requires by libvorbis aren't found
# during linking stage
LIBS="$LIBS -lc -lgcc -lnosys"
;;
@@ -3451,6 +3454,15 @@ _engines_built_static=""
_engines_built_dynamic=""
_engines_skipped=""
+# Show a message if looping over engines takes longer than 5 secs
+sh -c "
+ touch config.gnomes
+ sleep 5
+ if test -f config.gnomes; then
+ printf 'Employing little gnomes...'
+ rm -f config.gnomes
+ fi" 2>/dev/null &
+
for engine in $_engines; do
if test "`get_engine_sub $engine`" = "no" ; then
# It's a main engine
@@ -3515,6 +3527,14 @@ done
add_to_config_h_if_yes `get_var _tainted_build` '#define TAINTED_BUILD'
+# Complete the message on slow systems
+if test -f config.gnomes ; then
+ # Kill does not work well here as it produces nasty 'Killed' message
+ rm -rf config.gnomes
+else
+ echo " work is done"
+fi
+
#
# Show which engines ("frontends") are to be built
#
diff --git a/engines/agos/agos.h b/engines/agos/agos.h
index b1d2e6d735..359dfd5ff1 100644
--- a/engines/agos/agos.h
+++ b/engines/agos/agos.h
@@ -56,7 +56,7 @@ class SeekableReadStream;
}
namespace Graphics {
-class Surface;
+struct Surface;
}
namespace AGOS {
diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp
index ab67da32db..1510af8508 100644
--- a/engines/sci/engine/seg_manager.cpp
+++ b/engines/sci/engine/seg_manager.cpp
@@ -28,12 +28,6 @@
namespace Sci {
-enum {
- DEFAULT_SCRIPTS = 32,
- DEFAULT_OBJECTS = 8, ///< default number of objects per script
- DEFAULT_OBJECTS_INCREMENT = 4 ///< Number of additional objects to instantiate if we're running out of them
-};
-
SegManager::SegManager(ResourceManager *resMan) {
_heap.push_back(0);
diff --git a/engines/scumm/he/script_v100he.cpp b/engines/scumm/he/script_v100he.cpp
index 5a9172ff8a..56ea10f507 100644
--- a/engines/scumm/he/script_v100he.cpp
+++ b/engines/scumm/he/script_v100he.cpp
@@ -542,7 +542,7 @@ void ScummEngine_v100he::o100_arrayOps() {
int dim1end, dim1start, dim2end, dim2start;
int id, len, b, c, list[128];
int offs, tmp, tmp2;
- uint tmp3;
+ uint tmp3, type;
byte subOp = fetchScriptByte();
int array = fetchScriptWord();
@@ -625,11 +625,10 @@ void ScummEngine_v100he::o100_arrayOps() {
}
break;
case 132:
- debug(0, "o100_arrayOps: case 132");
- // TODO: Used by Moonbase Commander
+ // TODO: Used by room 2 script 2180 in Moonbase Commander
fetchScriptWord();
fetchScriptWord();
- pop();
+ type = pop();
pop();
pop();
pop();
@@ -646,6 +645,21 @@ void ScummEngine_v100he::o100_arrayOps() {
if (id == 0) {
defineArray(array, kDwordArray, dim2start, dim2end, dim1start, dim1end);
}
+ switch (type) {
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3:
+ break;
+ case 4:
+ break;
+ case 5:
+ break;
+ default:
+ error("o100_arrayOps: case 132 unknown type %d)", type);
+ }
+ debug(0, "o100_arrayOps: case 132 type %d", type);
break;
case 133:
b = pop();
diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp
index 7970d7806f..9711f6415b 100644
--- a/engines/scumm/he/script_v80he.cpp
+++ b/engines/scumm/he/script_v80he.cpp
@@ -171,7 +171,10 @@ void ScummEngine_v80he::o80_readConfigFile() {
case 6: // number
ConfFile.getKey((const char *)option, (const char *)section, entry);
- push(atoi(entry.c_str()));
+ if (!strcmp((char *)option, "Benchmark"))
+ push(2);
+ else
+ push(atoi(entry.c_str()));
break;
case 77: // HE 100
case 7: // string
diff --git a/engines/scumm/he/sprite_he.cpp b/engines/scumm/he/sprite_he.cpp
index 0b37673e4a..081110c7cd 100644
--- a/engines/scumm/he/sprite_he.cpp
+++ b/engines/scumm/he/sprite_he.cpp
@@ -804,12 +804,18 @@ void Sprite::setSpriteImage(int spriteId, int imageNum) {
if (_spriteTable[spriteId].image) {
_spriteTable[spriteId].imageStateCount = _vm->_wiz->getWizImageStates(_spriteTable[spriteId].image);
- _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly;
+
+ if (_vm->VAR(139))
+ _spriteTable[spriteId].flags |= kSFActive;
+ else
+ _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly;
if (_spriteTable[spriteId].image != origResId || _spriteTable[spriteId].imageStateCount != origResWizStates)
_spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw;
} else {
- if (_spriteTable[spriteId].flags & kSFImageless)
+ if (_vm->VAR(139))
+ _spriteTable[spriteId].flags &= ~kSFActive;
+ else if (_spriteTable[spriteId].flags & kSFImageless)
_spriteTable[spriteId].flags = 0;
else
_spriteTable[spriteId].flags = kSFChanged | kSFBlitDirectly;
diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp
index 5eea7acc6b..6d9e1f3f72 100644
--- a/engines/scumm/input.cpp
+++ b/engines/scumm/input.cpp
@@ -324,7 +324,17 @@ void ScummEngine::processInput() {
VAR(VAR_LEFTBTN_HOLD) = (_leftBtnPressed & msDown) != 0;
VAR(VAR_RIGHTBTN_HOLD) = (_rightBtnPressed & msDown) != 0;
- if (_game.version >= 7) {
+ if (_game.heversion >= 72) {
+ // HE72 introduced a flag for whether or not this is a click
+ // or the player is continuing to hold the button down.
+ // 0x80 signifies that the button is continuing to be held down
+ // Backyard Soccer needs this in order to function
+ if (VAR(VAR_LEFTBTN_HOLD) && !(_leftBtnPressed & msClicked))
+ VAR(VAR_LEFTBTN_HOLD) |= 0x80;
+
+ if (VAR(VAR_RIGHTBTN_HOLD) && !(_rightBtnPressed & msClicked))
+ VAR(VAR_RIGHTBTN_HOLD) |= 0x80;
+ } else if (_game.version >= 7) {
VAR(VAR_LEFTBTN_DOWN) = (_leftBtnPressed & msClicked) != 0;
VAR(VAR_RIGHTBTN_DOWN) = (_rightBtnPressed & msClicked) != 0;
}
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp
index 33db70985d..50ae045052 100644
--- a/engines/scumm/sound.cpp
+++ b/engines/scumm/sound.cpp
@@ -1144,10 +1144,10 @@ int ScummEngine::readSoundResource(ResId idx) {
break;
}
- // We only allow SPK resources for PC Speaker, PCJr and CMS here
+ // We only allow SPK resources for PC Speaker and PCJr here
// since other resource would sound horribly with their output
// drivers.
- if ((_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR || _sound->_musicType == MDT_CMS) && pri != 11)
+ if ((_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR) && pri != 11)
pri = -1;
// We only allow ADL resources when AdLib or FM-Towns is used as
diff --git a/engines/tinsel/adpcm.cpp b/engines/tinsel/adpcm.cpp
index 4ea835586b..ca3150ca3d 100644
--- a/engines/tinsel/adpcm.cpp
+++ b/engines/tinsel/adpcm.cpp
@@ -61,7 +61,7 @@ void Tinsel_ADPCMStream::readBufferTinselHeader() {
int16 Tinsel_ADPCMStream::decodeTinsel(int16 code, double eVal) {
double sample;
- sample = (double) code;
+ sample = (double)code;
sample *= eVal * _status.predictor;
sample += (_status.d0 * _status.K0) + (_status.d1 * _status.K1);