aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2006-06-16 06:26:26 +0000
committerTorbjörn Andersson2006-06-16 06:26:26 +0000
commit50673f9f1fada025a0b6804b0bd17cd9262226dc (patch)
tree7cf16b1392ce9d1ef5bf331134e1506526d75ab6
parent84b54c31732538464ee8d75644a0587aa32ff5f5 (diff)
downloadscummvm-rg350-50673f9f1fada025a0b6804b0bd17cd9262226dc.tar.gz
scummvm-rg350-50673f9f1fada025a0b6804b0bd17cd9262226dc.tar.bz2
scummvm-rg350-50673f9f1fada025a0b6804b0bd17cd9262226dc.zip
The top dialog can change during the event loop. In that case, flush all the
dialog-related events since they were probably generated while the old dialog was still visible, and therefore note intended for the new one. This hopefully fixes strange behaviour/crashes with pop-up widgets. (Most easy to trigger in 3x mode or when running ScummVM under Valgrind.) svn-id: r23141
-rw-r--r--gui/newgui.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/gui/newgui.cpp b/gui/newgui.cpp
index 57c23e35e2..c8fd560691 100644
--- a/gui/newgui.cpp
+++ b/gui/newgui.cpp
@@ -201,6 +201,9 @@ void NewGui::runLoop() {
uint32 time = _system->getMillis();
while (_system->pollEvent(event)) {
+ if (activeDialog != _dialogStack.top() && event.type != OSystem::EVENT_QUIT && event.type != OSystem::EVENT_SCREEN_CHANGED)
+ continue;
+
Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
switch (event.type) {
@@ -270,7 +273,7 @@ void NewGui::runLoop() {
}
// check if event should be sent again (keydown)
- if (_currentKeyDown.keycode != 0) {
+ if (_currentKeyDown.keycode != 0 && activeDialog == _dialogStack.top()) {
if (_keyRepeatTime < time) {
// fire event
activeDialog->handleKeyDown(_currentKeyDown.ascii, _currentKeyDown.keycode, _currentKeyDown.flags);