aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/event.cpp')
-rw-r--r--engines/sci/event.cpp46
1 files changed, 30 insertions, 16 deletions
diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp
index 2967b55ec5..e69095a6b1 100644
--- a/engines/sci/event.cpp
+++ b/engines/sci/event.cpp
@@ -253,10 +253,6 @@ SciEvent EventManager::getScummVMEvent() {
}
}
- // If we reached here, make sure that it's a keydown event
- if (ev.type != Common::EVENT_KEYDOWN)
- return noEvent;
-
// Check for Control-Shift-D (debug console)
if (ev.type == Common::EVENT_KEYDOWN && ev.kbd.hasFlags(Common::KBD_CTRL | Common::KBD_SHIFT) && ev.kbd.keycode == Common::KEYCODE_d) {
// Open debug console
@@ -265,19 +261,23 @@ SciEvent EventManager::getScummVMEvent() {
return noEvent;
}
+ // The IBM keyboard driver prior to SCI1.1 only sent keydown events to the
+ // interpreter
+ if (ev.type != Common::EVENT_KEYDOWN && getSciVersion() < SCI_VERSION_1_1) {
+ return noEvent;
+ }
const Common::KeyCode scummVMKeycode = ev.kbd.keycode;
input.character = ev.kbd.ascii;
- input.type = kSciEventKeyDown;
-
- if (scummVMKeycode >= Common::KEYCODE_KP0 && scummVMKeycode <= Common::KEYCODE_KP9) {
- if (!(scummVMKeyFlags & Common::KBD_NUM)) {
- // HACK: Num-Lock not enabled
- // We shouldn't get a valid ascii code in these cases. We fix it here, so that cursor keys
- // on the numpad work properly.
- input.character = 0;
- }
+
+ if (scummVMKeycode >= Common::KEYCODE_KP0 && scummVMKeycode <= Common::KEYCODE_KP9 && !(scummVMKeyFlags & Common::KBD_NUM)) {
+ // TODO: Leaky abstractions from SDL should not be handled in game
+ // engines!
+ // SDL may provide a character value for numpad keys even if numlock is
+ // turned off, but arrow/navigation keys won't get mapped below if a
+ // character value is provided
+ input.character = 0;
}
if (input.character && input.character <= 0xFF) {
@@ -336,10 +336,24 @@ SciEvent EventManager::getScummVMEvent() {
input.character -= 96;
}
- // If no actual key was pressed (e.g. if only a modifier key was pressed),
- // ignore the event
- if (!input.character)
+ // In SCI1.1, if only a modifier key is pressed, the IBM keyboard driver
+ // sends an event the same as if a key had been released
+ if (getSciVersion() != SCI_VERSION_1_1 && !input.character) {
return noEvent;
+ } else if (!input.character || ev.type == Common::EVENT_KEYUP) {
+ input.type = kSciEventKeyUp;
+
+ // SCI32 includes the released key character code in keyup messages, but
+ // the IBM keyboard driver in SCI1.1 sends a special character value
+ // instead. This is necessary to prevent at least Island of Dr Brain
+ // from processing keyup events as though they were keydown events in
+ // the word search puzzle
+ if (getSciVersion() == SCI_VERSION_1_1) {
+ input.character = 0x8000;
+ }
+ } else {
+ input.type = kSciEventKeyDown;
+ }
return input;
}