aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorathrxx2011-06-25 15:41:58 +0200
committerathrxx2011-06-25 15:54:36 +0200
commit1a05efa8eda02eb2c40432e19d77c6e507c86453 (patch)
tree5a3886669cf790ef7c9efe0562b132c48602a15d /engines
parent5a2bc12f269a04a1b703112eaef7cf499c70884d (diff)
downloadscummvm-rg350-1a05efa8eda02eb2c40432e19d77c6e507c86453.tar.gz
scummvm-rg350-1a05efa8eda02eb2c40432e19d77c6e507c86453.tar.bz2
scummvm-rg350-1a05efa8eda02eb2c40432e19d77c6e507c86453.zip
GUI: fix bug #2822778
(Savegames now get loaded after GMM dialogue execution. This avoids mouse cursor glitches (e.g. mouse cursors which get changed during loadGameState() being popped when the dialogue closes).
Diffstat (limited to 'engines')
-rw-r--r--engines/dialogs.cpp10
-rw-r--r--engines/engine.cpp20
-rw-r--r--engines/engine.h16
3 files changed, 39 insertions, 7 deletions
diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp
index 89c07ad24c..1a077e5bf7 100644
--- a/engines/dialogs.cpp
+++ b/engines/dialogs.cpp
@@ -246,14 +246,10 @@ void MainMenuDialog::load() {
int slot = _loadDialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName());
- if (slot >= 0) {
- // FIXME: For now we just ignore the return
- // value, which is quite bad since it could
- // be a fatal loading error, which renders
- // the engine unusable.
- _engine->loadGameState(slot);
+ _engine->setGameToLoadSlot(slot);
+
+ if (slot >= 0)
close();
- }
}
enum {
diff --git a/engines/engine.cpp b/engines/engine.cpp
index dde5064dc4..b952f065ad 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -96,6 +96,7 @@ Engine::Engine(OSystem *syst)
_targetName(ConfMan.getActiveDomainName()),
_pauseLevel(0),
_pauseStartTime(0),
+ _saveSlotToLoad(-1),
_engineStartTime(_system->getMillis()),
_mainMenuDialog(NULL) {
@@ -396,7 +397,22 @@ void Engine::pauseEngineIntern(bool pause) {
void Engine::openMainMenuDialog() {
if (!_mainMenuDialog)
_mainMenuDialog = new MainMenuDialog(this);
+
+ setGameToLoadSlot(-1);
+
runDialog(*_mainMenuDialog);
+
+ // Load savegame after main menu execution
+ // (not from inside the menu loop to avoid
+ // mouse cursor glitches and simliar bugs,
+ // e.g. #2822778).
+ // FIXME: For now we just ignore the return
+ // value, which is quite bad since it could
+ // be a fatal loading error, which renders
+ // the engine unusable.
+ if (_saveSlotToLoad > 0)
+ loadGameState(_saveSlotToLoad);
+
syncSoundSettings();
}
@@ -437,6 +453,10 @@ int Engine::runDialog(GUI::Dialog &dialog) {
return result;
}
+void Engine::setGameToLoadSlot(int slot) {
+ _saveSlotToLoad = slot;
+}
+
void Engine::syncSoundSettings() {
// Sync the engine with the config manager
int soundVolumeMusic = ConfMan.getInt("music_volume");
diff --git a/engines/engine.h b/engines/engine.h
index 06b7f7dedd..2796df5c4f 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -82,6 +82,13 @@ private:
*/
int32 _engineStartTime;
+ /**
+ * Save slot selected via global main menu.
+ * This slot will be loaded after main menu execution (not from inside
+ * the menu loop, to avoid bugs like #2822778).
+ */
+ int _saveSlotToLoad;
+
public:
@@ -186,6 +193,15 @@ public:
virtual Common::Error loadGameState(int slot);
/**
+ * Sets the game slot for a savegame to be loaded after global
+ * main menu execution. This is to avoid loading a savegame from
+ * inside the menu loop which causes bugs like #2822778.
+ *
+ * @param slot the slot from which a savestate should be loaded.
+ */
+ void setGameToLoadSlot(int slot);
+
+ /**
* Indicates whether a game state can be loaded.
*/
virtual bool canLoadGameStateCurrently();