aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2009-02-25 18:23:28 +0000
committerWillem Jan Palenstijn2009-02-25 18:23:28 +0000
commit9ed544679a352d50cef9b1a9a0c12dd3dd63ea61 (patch)
tree7540a5ecf532218bbfac4f420693f9f3fbce7fcc /engines
parent98a7ba4ec3899e7d6b154169a39427a998c4758c (diff)
downloadscummvm-rg350-9ed544679a352d50cef9b1a9a0c12dd3dd63ea61.tar.gz
scummvm-rg350-9ed544679a352d50cef9b1a9a0c12dd3dd63ea61.tar.bz2
scummvm-rg350-9ed544679a352d50cef9b1a9a0c12dd3dd63ea61.zip
Interpret NONBLOCK as PEEK; poll while sleeping.
Also use Common::List for internal event queue. svn-id: r38880
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/gfx/operations.cpp64
-rw-r--r--engines/sci/gfx/operations.h9
-rw-r--r--engines/sci/include/uinput.h2
3 files changed, 35 insertions, 40 deletions
diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp
index 80bf9b6c60..4e62bfc846 100644
--- a/engines/sci/gfx/operations.cpp
+++ b/engines/sci/gfx/operations.cpp
@@ -551,7 +551,7 @@ static int _gfxop_init_common(gfx_state_t *state, gfx_options_t *options, void *
state->options = options;
state->mouse_pointer_in_hw = 0;
state->disable_dirty = 0;
- state->events = NULL;
+ state->events.clear();
state->pic = state->pic_unscaled = NULL;
@@ -1368,15 +1368,18 @@ int gfxop_sleep(gfx_state_t *state, uint32 msecs) {
const uint32 wakeup_time = g_system->getMillis() + msecs;
while (true) {
- GFXOP_FULL_POINTER_REFRESH;
+ // let backend process events and update the screen
+ gfxop_get_event(state, SCI_EVT_PEEK);
+ g_system->updateScreen();
time = g_system->getMillis();
- if (time >= wakeup_time)
+ if (time + 10 < wakeup_time) {
+ g_system->delayMillis(10);
+ } else {
+ if (time < wakeup_time)
+ g_system->delayMillis(wakeup_time - time);
break;
- // FIXME: Busy waiting like this is usually not a good idea if it is for
- // more than a few milliseconds. One should invoke OSystem::pollEvent during longer
- // waits, else the mouse cursor might not be updated properly, and the system
- // will seem sluggish to the user.
- g_system->delayMillis(wakeup_time - time);
+ }
+
}
return GFX_OK;
@@ -1616,37 +1619,32 @@ static int _gfxop_numlockify(int c) {
sci_event_t gfxop_get_event(gfx_state_t *state, unsigned int mask) {
sci_event_t error_event = { SCI_EVT_ERROR, 0, 0, 0 };
- sci_event_t event = { 0, 0, 0, 0 };;
- gfx_input_event_t **seekerp = &(state->events);
+ sci_event_t event = { 0, 0, 0, 0 };
BASIC_CHECKS(error_event);
if (_gfxop_remove_pointer(state)) {
GFXERROR("Failed to remove pointer before processing event!\n");
}
- while (*seekerp && !((*seekerp)->event.type & mask))
- seekerp = &((*seekerp)->next);
-
- if (*seekerp) {
- gfx_input_event_t *goner = *seekerp;
- event = goner->event;
- *seekerp = goner->next;
- free(goner);
- } else {
- event.type = 0;
-
- if (!(mask & SCI_EVT_NONBLOCK)) {
- do {
- if (event.type) {
- *seekerp = (gfx_input_event_t *)sci_malloc(sizeof(gfx_input_event_t));
- (*seekerp)->next = NULL;
-
- (*seekerp)->event = event;
- seekerp = &((*seekerp)->next);
- }
- event = state->driver->get_event(state->driver);
-
- } while (event.type && !(event.type & mask));
+ // Get all queued events from graphics driver
+ do {
+ event = state->driver->get_event(state->driver);
+ if (event.type)
+ state->events.push_back(event);
+ } while (event.type);
+
+ // Search for matching event in queue
+ Common::List<sci_event_t>::iterator iter = state->events.begin();
+ while (iter != state->events.end() && !((*iter).type & mask))
+ ++iter;
+
+ if (iter != state->events.end()) {
+ // Event found
+ event = *iter;
+
+ // If not peeking at the queue, remove the event
+ if (!(mask & SCI_EVT_PEEK)) {
+ state->events.erase(iter);
}
}
diff --git a/engines/sci/gfx/operations.h b/engines/sci/gfx/operations.h
index 5eee47e79c..e909a78ea0 100644
--- a/engines/sci/gfx/operations.h
+++ b/engines/sci/gfx/operations.h
@@ -34,6 +34,8 @@
#include "sci/gfx/gfx_system.h"
#include "sci/include/uinput.h"
+#include "common/list.h"
+
namespace Sci {
#define GFXOP_NO_POINTER -1
@@ -87,11 +89,6 @@ struct gfx_dirty_rect_t {
};
-struct gfx_input_event_t {
- sci_event_t event;
- gfx_input_event_t *next;
-};
-
struct gfx_state_t {
int version; /* Interpreter version */
@@ -135,7 +132,7 @@ struct gfx_state_t {
int pic_nr; /* Number of the current pic */
int palette_nr; /* Palette number of the current pic */
- gfx_input_event_t *events;
+ Common::List<sci_event_t> events;
gfx_pixmap_t *fullscreen_override; /* An optional override picture which must have unscaled
** full-screen size, which overrides all other visibility, and
diff --git a/engines/sci/include/uinput.h b/engines/sci/include/uinput.h
index eb9a5a6439..dbf8cc424f 100644
--- a/engines/sci/include/uinput.h
+++ b/engines/sci/include/uinput.h
@@ -61,7 +61,7 @@ struct sci_event_t {
/*Fake values for other events*/
#define SCI_EVT_ERROR (1<<10)
#define SCI_EVT_QUIT (1<<11)
-#define SCI_EVT_NONBLOCK (1<<15)
+#define SCI_EVT_PEEK (1<<15)
/* The QUIT event may be used to signal an external 'quit' command being
** issued to the gfx driver. */
#define SCI_EVT_ANY 0x7fff