aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorathrxx2011-06-25 15:41:58 +0200
committerathrxx2011-06-25 15:54:36 +0200
commit1a05efa8eda02eb2c40432e19d77c6e507c86453 (patch)
tree5a3886669cf790ef7c9efe0562b132c48602a15d
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).
-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();