diff options
-rw-r--r-- | common/main.cpp | 3 | ||||
-rw-r--r-- | gui/dialog.cpp | 12 | ||||
-rw-r--r-- | gui/dialog.h | 11 | ||||
-rw-r--r-- | gui/newgui.cpp | 43 | ||||
-rw-r--r-- | gui/newgui.h | 2 | ||||
-rw-r--r-- | scumm/dialogs.cpp | 2 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 3 |
7 files changed, 47 insertions, 29 deletions
diff --git a/common/main.cpp b/common/main.cpp index fee7d71183..ce5cec3df5 100644 --- a/common/main.cpp +++ b/common/main.cpp @@ -136,8 +136,7 @@ static void launcherDialog(GameDetector &detector, OSystem *system) g_system = system; Dialog *dlg = new LauncherDialog(g_gui, detector); - dlg->open(); - g_gui->runLoop(); + dlg->runModal(); delete dlg; } diff --git a/gui/dialog.cpp b/gui/dialog.cpp index ec386f90f2..09f76edb1c 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -50,6 +50,18 @@ Dialog::~Dialog() _firstWidget = 0; } +int Dialog::runModal() +{ + // Open up + open(); + + // Start processing events + _gui->runLoop(); + + // FIXME - for now always return 0.... + return 0; +} + void Dialog::open() { Widget *w = _firstWidget; diff --git a/gui/dialog.h b/gui/dialog.h index 509ae6d385..7d7224c480 100644 --- a/gui/dialog.h +++ b/gui/dialog.h @@ -49,7 +49,13 @@ public: _mouseWidget(0), _focusedWidget(0), _visible(false) {} virtual ~Dialog(); + + virtual int runModal(); + + NewGui *getGui() { return _gui; } + bool isVisible() const { return _visible; } +protected: virtual void open(); virtual void close(); @@ -63,11 +69,6 @@ public: virtual void handleMouseMoved(int x, int y, int button); virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data); - NewGui *getGui() { return _gui; } - - bool isVisible() const { return _visible; } - -protected: Widget* findWidget(int x, int y); // Find the widget at pos x,y if any Widget* addButton(int x, int y, const ScummVM::String &label, uint32 cmd, char hotkey); diff --git a/gui/newgui.cpp b/gui/newgui.cpp index aed586fe04..61f50e2b72 100644 --- a/gui/newgui.cpp +++ b/gui/newgui.cpp @@ -82,7 +82,7 @@ static byte guifont[] = { // Constructor NewGui::NewGui(OSystem *system) : _system(system), _screen(0), _needRedraw(false), - _currentKeyDown(0), _cursorAnimateCounter(0), _cursorAnimateTimer(0) + _stateIsSaved(false), _currentKeyDown(0), _cursorAnimateCounter(0), _cursorAnimateTimer(0) { // Setup some default GUI colors. // TODO - either use nicer values, or maybe make this configurable? @@ -98,23 +98,18 @@ NewGui::NewGui(OSystem *system) : _system(system), _screen(0), _needRedraw(false void NewGui::runLoop() { - if (!isActive()) - return; - - Dialog *activeDialog; - int i; - OSystem::Event event; + Dialog *activeDialog = _dialogStack.top(); + bool didSaveState = false; - saveState(); - - _currentKeyDown = 0; + if (activeDialog == 0) + return; - _lastClick.x = _lastClick.y = 0; - _lastClick.time = 0; - _lastClick.count = 0; + if (!_stateIsSaved) { + saveState(); + didSaveState = true; + } - while (isActive()) { - activeDialog = _dialogStack.top(); + while (activeDialog == _dialogStack.top()) { activeDialog->handleTickle(); @@ -123,15 +118,15 @@ void NewGui::runLoop() // This is necessary to get the blending right. _system->clear_overlay(); _system->grab_overlay(_screen, _screenPitch); - for (i = 0; i < _dialogStack.size(); i++) + for (int i = 0; i < _dialogStack.size(); i++) _dialogStack[i]->draw(); _needRedraw = false; } animateCursor(); - _system->update_screen(); + OSystem::Event event; uint32 time = _system->get_msecs(); while (_system->poll_event(&event)) { @@ -192,7 +187,8 @@ void NewGui::runLoop() _system->delay_msecs(10); } - restoreState(); + if (didSaveState) + restoreState(); } #pragma mark - @@ -209,6 +205,13 @@ void NewGui::saveState() // _screen = new int16[_system->get_width() * _system->get_height()]; // _screenPitch = _system->get_width(); _system->grab_overlay(_screen, _screenPitch); + + _currentKeyDown = 0; + _lastClick.x = _lastClick.y = 0; + _lastClick.time = 0; + _lastClick.count = 0; + + _stateIsSaved = true; } void NewGui::restoreState() @@ -221,7 +224,9 @@ void NewGui::restoreState() _screen = 0; } - _system->update_screen(); + _system->update_screen(); + + _stateIsSaved = false; } void NewGui::openDialog(Dialog *dialog) diff --git a/gui/newgui.h b/gui/newgui.h index bd97bcaaf0..957c63c1fa 100644 --- a/gui/newgui.h +++ b/gui/newgui.h @@ -81,6 +81,8 @@ protected: bool _needRedraw; DialogStack _dialogStack; + bool _stateIsSaved; + // for continuous events (keyDown) int _currentKeyDown, _currentKeyDownFlags; uint32 _keyRepeatTime; diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp index 3120a3634a..c1aec50393 100644 --- a/scumm/dialogs.cpp +++ b/scumm/dialogs.cpp @@ -468,7 +468,7 @@ void OptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data // TODO break; case kAboutCmd: - _aboutDialog->open(); + _aboutDialog->runModal(); break; case kMasterVolumeChanged: _soundVolumeMaster = masterVolumeSlider->getValue(); diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index a1b43dc418..e699d22a53 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -952,8 +952,7 @@ void Scumm::runDialog(Dialog *dialog) _sound->pauseSounds(true); // Open & run the dialog - dialog->open(); - _newgui->runLoop(); + dialog->runModal(); // Restore old cursor updateCursor(); |