[Scummvm-git-logs] scummvm master -> 41a95cdf902ece7eaa1d2963429ed331ef3fd91b

sev- noreply at scummvm.org
Mon Aug 18 10:12:27 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
41a95cdf90 LAB: Add keymapper support


Commit: 41a95cdf902ece7eaa1d2963429ed331ef3fd91b
    https://github.com/scummvm/scummvm/commit/41a95cdf902ece7eaa1d2963429ed331ef3fd91b
Author: aunnoman1 (aunnoman123 at outlook.com)
Date: 2025-08-18T12:12:24+02:00

Commit Message:
LAB: Add keymapper support

Changed paths:
    engines/lab/POTFILES
    engines/lab/console.cpp
    engines/lab/dispman.cpp
    engines/lab/engine.cpp
    engines/lab/eventman.cpp
    engines/lab/eventman.h
    engines/lab/interface.cpp
    engines/lab/interface.h
    engines/lab/intro.cpp
    engines/lab/lab.h
    engines/lab/map.cpp
    engines/lab/metaengine.cpp
    engines/lab/special.cpp


diff --git a/engines/lab/POTFILES b/engines/lab/POTFILES
index 13517e87a5e..ae75023592a 100644
--- a/engines/lab/POTFILES
+++ b/engines/lab/POTFILES
@@ -1,4 +1,5 @@
 engines/lab/engine.cpp
+engines/lab/metaengine.cpp
 engines/lab/processroom.cpp
 engines/lab/savegame.cpp
 engines/lab/speciallocks.cpp
diff --git a/engines/lab/console.cpp b/engines/lab/console.cpp
index 8cbe0bd9030..c5fa1577b2e 100644
--- a/engines/lab/console.cpp
+++ b/engines/lab/console.cpp
@@ -29,6 +29,8 @@
 #include "lab/processroom.h"
 #include "lab/resource.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Lab {
 
 Console::Console(LabEngine *vm) : GUI::Debugger(), _vm(vm) {
@@ -57,6 +59,12 @@ bool Console::Cmd_Scene(int argc, const char **argv) {
 	_vm->_event->simulateEvent();
 	_vm->_graphics->_longWinInFront = false;
 
+	Common::Keymapper *keymapper = _vm->_system->getEventManager()->getKeymapper();
+	keymapper->disableAllGameKeymaps();
+	keymapper->getKeymap("lab-default")->setEnabled(true);
+	keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+	keymapper->getKeymap("exit")->setEnabled(true);
+
 	return false;
 }
 
diff --git a/engines/lab/dispman.cpp b/engines/lab/dispman.cpp
index afac8657fed..91e66ddb95c 100644
--- a/engines/lab/dispman.cpp
+++ b/engines/lab/dispman.cpp
@@ -323,16 +323,16 @@ void DisplayMan::setUpScreens() {
 	// It's very convenient to have those shortcut, so I added them
 	// for all versions. (Strangerke)
 	uint16 y = _vm->_utils->vgaScaleY(173) - _vm->_utils->svgaCord(2);
-	moveButtonList->push_back(i->createButton(  1, y, 0, Common::KEYCODE_t,     moveImages[0],  moveImages[1]));
-	moveButtonList->push_back(i->createButton( 33, y, 1, Common::KEYCODE_m,     moveImages[2],  moveImages[3]));
-	moveButtonList->push_back(i->createButton( 65, y, 2, Common::KEYCODE_o,     moveImages[4],  moveImages[5]));
-	moveButtonList->push_back(i->createButton( 97, y, 3, Common::KEYCODE_c,     moveImages[6],  moveImages[7]));
-	moveButtonList->push_back(i->createButton(129, y, 4, Common::KEYCODE_l,     moveImages[8],  moveImages[9]));
-	moveButtonList->push_back(i->createButton(161, y, 5, Common::KEYCODE_i,     moveImages[12], moveImages[13]));
-	moveButtonList->push_back(i->createButton(193, y, 6, Common::KEYCODE_LEFT,  moveImages[14], moveImages[15]));
-	moveButtonList->push_back(i->createButton(225, y, 7, Common::KEYCODE_UP,    moveImages[16], moveImages[17]));
-	moveButtonList->push_back(i->createButton(257, y, 8, Common::KEYCODE_RIGHT, moveImages[18], moveImages[19]));
-	moveButtonList->push_back(i->createButton(289, y, 9, Common::KEYCODE_p,     moveImages[10], moveImages[11]));
+	moveButtonList->push_back(i->createButton(  1, y, 0, kActionTake,     moveImages[0],  moveImages[1]));
+	moveButtonList->push_back(i->createButton( 33, y, 1, kActionMove,     moveImages[2],  moveImages[3]));
+	moveButtonList->push_back(i->createButton( 65, y, 2, kActionOpen,     moveImages[4],  moveImages[5]));
+	moveButtonList->push_back(i->createButton( 97, y, 3, kActionClose,     moveImages[6],  moveImages[7]));
+	moveButtonList->push_back(i->createButton(129, y, 4, kActionLook,     moveImages[8],  moveImages[9]));
+	moveButtonList->push_back(i->createButton(161, y, 5, kActionInv,     moveImages[12], moveImages[13]));
+	moveButtonList->push_back(i->createButton(193, y, 6, kActionLeft,  moveImages[14], moveImages[15]));
+	moveButtonList->push_back(i->createButton(225, y, 7, kActionForward,    moveImages[16], moveImages[17]));
+	moveButtonList->push_back(i->createButton(257, y, 8, kActionRight, moveImages[18], moveImages[19]));
+	moveButtonList->push_back(i->createButton(289, y, 9, kActionMap,     moveImages[10], moveImages[11]));
 
 	// TODO: The INV file is not present in the Amiga version
 	Common::File *invFile = _vm->_resource->openDataFile("P:Inv");
@@ -345,23 +345,23 @@ void DisplayMan::setUpScreens() {
 	}
 
 	if (_vm->getPlatform() == Common::kPlatformWindows) {
-		invButtonList->push_back(i->createButton( 24, y, 0, Common::KEYCODE_ESCAPE, invImages[0],   invImages[1]));
-		invButtonList->push_back(i->createButton( 56, y, 1, Common::KEYCODE_g,      invImages[2],   invImages[3]));
-		invButtonList->push_back(i->createButton( 94, y, 2, Common::KEYCODE_u,      invImages[4],   invImages[5]));
-		invButtonList->push_back(i->createButton(126, y, 3, Common::KEYCODE_l,      moveImages[8],  moveImages[9]));
-		invButtonList->push_back(i->createButton(164, y, 4, Common::KEYCODE_LEFT,   moveImages[14], moveImages[15]));
-		invButtonList->push_back(i->createButton(196, y, 5, Common::KEYCODE_RIGHT,  moveImages[18], moveImages[19]));
+		invButtonList->push_back(i->createButton( 24, y, 0, kActionMainDisplay, invImages[0],   invImages[1]));
+		invButtonList->push_back(i->createButton( 56, y, 1, kActionSaveLoad,      invImages[2],   invImages[3]));
+		invButtonList->push_back(i->createButton( 94, y, 2, kActionUse,      invImages[4],   invImages[5]));
+		invButtonList->push_back(i->createButton(126, y, 3, kActionInvLook,      moveImages[8],  moveImages[9]));
+		invButtonList->push_back(i->createButton(164, y, 4, kActionPrev,   moveImages[14], moveImages[15]));
+		invButtonList->push_back(i->createButton(196, y, 5, kActionNext,  moveImages[18], moveImages[19]));
 	// The windows version has 2 extra buttons for breadcrumb trail
 	// CHECKME: the game is really hard to play without those, maybe we could add something to enable that.
-		invButtonList->push_back(i->createButton(234, y, 6, Common::KEYCODE_b, invImages[6], invImages[7]));
-		invButtonList->push_back(i->createButton(266, y, 7, Common::KEYCODE_f, invImages[8], invImages[9]));
+		invButtonList->push_back(i->createButton(234, y, 6, kActionDropBreadcrumb, invImages[6], invImages[7]));
+		invButtonList->push_back(i->createButton(266, y, 7, kActionFollowBreadcrumbs, invImages[8], invImages[9]));
 	} else {
-		invButtonList->push_back(i->createButton( 58, y, 0, Common::KEYCODE_ESCAPE, invImages[0],   invImages[1]));
-		invButtonList->push_back(i->createButton( 90, y, 1, Common::KEYCODE_g,      invImages[2],   invImages[3]));
-		invButtonList->push_back(i->createButton(128, y, 2, Common::KEYCODE_u,      invImages[4],   invImages[5]));
-		invButtonList->push_back(i->createButton(160, y, 3, Common::KEYCODE_l,      moveImages[8],  moveImages[9]));
-		invButtonList->push_back(i->createButton(198, y, 4, Common::KEYCODE_LEFT,   moveImages[14], moveImages[15]));
-		invButtonList->push_back(i->createButton(230, y, 5, Common::KEYCODE_RIGHT,  moveImages[18], moveImages[19]));
+		invButtonList->push_back(i->createButton( 58, y, 0, kActionMainDisplay, invImages[0],   invImages[1]));
+		invButtonList->push_back(i->createButton( 90, y, 1, kActionSaveLoad,      invImages[2],   invImages[3]));
+		invButtonList->push_back(i->createButton(128, y, 2, kActionUse,      invImages[4],   invImages[5]));
+		invButtonList->push_back(i->createButton(160, y, 3, kActionInvLook,      moveImages[8],  moveImages[9]));
+		invButtonList->push_back(i->createButton(198, y, 4, kActionPrev,   moveImages[14], moveImages[15]));
+		invButtonList->push_back(i->createButton(230, y, 5, kActionNext,  moveImages[18], moveImages[19]));
 	}
 
 	delete invFile;
diff --git a/engines/lab/engine.cpp b/engines/lab/engine.cpp
index d008e92d25d..887a808436f 100644
--- a/engines/lab/engine.cpp
+++ b/engines/lab/engine.cpp
@@ -47,6 +47,8 @@
 #include "lab/speciallocks.h"
 #include "lab/utils.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Lab {
 
 enum SpecialLock {
@@ -302,8 +304,19 @@ void LabEngine::interfaceOn() {
 }
 
 bool LabEngine::doUse(uint16 curInv) {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+
 	switch (curInv) {
 	case kItemMap:
+		if (_mainDisplay) {
+			keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+			keymapper->getKeymap("exit")->setEnabled(false);
+			keymapper->getKeymap("map")->setEnabled(true);
+		} else if (_alternate) {
+			keymapper->getKeymap("inventory")->setEnabled(false);
+			keymapper->getKeymap("map")->setEnabled(true);
+		}
+
 		drawStaticMessage(kTextUseMap);
 		interfaceOff();
 		_anim->stopDiff();
@@ -313,8 +326,22 @@ bool LabEngine::doUse(uint16 curInv) {
 		_graphics->setPalette(initColors, 8);
 		_graphics->drawMessage("", false);
 		_graphics->drawPanel();
+
+		if (_alternate) {
+			keymapper->getKeymap("map")->setEnabled(false);
+			keymapper->getKeymap("inventory")->setEnabled(true);
+		} else {
+			keymapper->getKeymap("map")->setEnabled(false);
+			keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+			keymapper->getKeymap("exit")->setEnabled(true);
+		}
+
 		return true;
 	case kItemJournal:
+		keymapper->getKeymap("inventory")->setEnabled(false);
+		keymapper->getKeymap("journal")->setEnabled(true);
+		keymapper->getKeymap("exit")->setEnabled(true);
+
 		drawStaticMessage(kTextUseJournal);
 		interfaceOff();
 		_anim->stopDiff();
@@ -323,6 +350,11 @@ bool LabEngine::doUse(uint16 curInv) {
 		doJournal();
 		_graphics->drawPanel();
 		_graphics->drawMessage("", false);
+
+		keymapper->getKeymap("journal")->setEnabled(false);
+		keymapper->getKeymap("exit")->setEnabled(false);
+		keymapper->getKeymap("inventory")->setEnabled(true);
+
 		return true;
 	case kItemLamp:
 		interfaceOff();
@@ -563,7 +595,7 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
 	uint16 oldDirection = 0;
 	uint16 lastInv = kItemMap;
 
-	if (code == Common::KEYCODE_RETURN)
+	if (msgClass == kMessageAction && code == kActionInteract)
 		msgClass = kMessageLeftClick;
 
 	bool leftButtonClick = (msgClass == kMessageLeftClick);
@@ -572,13 +604,13 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
 	_anim->_doBlack = false;
 
 	if (_graphics->_longWinInFront) {
-		if (msgClass == kMessageRawKey || leftButtonClick || rightButtonClick) {
+		if (msgClass == kMessageAction || leftButtonClick || rightButtonClick) {
 			_graphics->_longWinInFront = false;
 			_graphics->drawPanel();
 			drawRoomMessage(curInv, _closeDataPtr);
 			_graphics->screenUpdate();
 		}
-	} else if (msgClass == kMessageRawKey) {
+	} else if (msgClass == kMessageAction) {
 		return processKey(curMsg, msgClass, qualifier, curPos, curInv, forceDraw, code);
 	} else if (msgClass == kMessageButtonUp) {
 		if (!_alternate)
@@ -606,11 +638,21 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
 		// Sets the correct button list
 		interfaceOn();
 
+		Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+
 		if (_alternate) {
 			if (lastInv && _conditions->in(lastInv))
 				curInv = lastInv;
 			else
 				decIncInv(&curInv, false);
+
+			keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+			keymapper->getKeymap("exit")->setEnabled(false);
+			keymapper->getKeymap("inventory")->setEnabled(true);
+		} else {
+			keymapper->getKeymap("inventory")->setEnabled(false);
+			keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+			keymapper->getKeymap("exit")->setEnabled(true);
 		}
 
 		_graphics->drawPanel();
@@ -624,19 +666,21 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
 }
 
 bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualifier, Common::Point &curPos, uint16 &curInv, bool &forceDraw, uint16 code) {
-	if ((getPlatform() == Common::kPlatformWindows) && (code == Common::KEYCODE_b)) {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+
+	if ((getPlatform() == Common::kPlatformWindows) && (code == kActionDropBreadcrumb)) {
 		// Start bread crumbs
 		_breadCrumbs[0]._crumbRoomNum = 0;
 		_numCrumbs = 0;
 		_droppingCrumbs = true;
 		_interface->mayShowCrumbIndicator();
 		_graphics->screenUpdate();
-	} else if (getPlatform() == Common::kPlatformWindows && (code == Common::KEYCODE_f || code == Common::KEYCODE_r)) {
+	} else if (getPlatform() == Common::kPlatformWindows && (code == kActionFollowBreadcrumbs || code == kActionRunWhileFollowingBreadcrumbs)) {
 		// Follow bread crumbs
 		if (_droppingCrumbs) {
 			if (_numCrumbs > 0) {
 				_followingCrumbs = true;
-				_followCrumbsFast = (code == Common::KEYCODE_r);
+				_followCrumbsFast = (code == kActionRunWhileFollowingBreadcrumbs);
 				_isCrumbTurning = false;
 				_isCrumbWaiting = false;
 				_crumbTimestamp = _system->getMillis();
@@ -652,6 +696,10 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
 					_graphics->drawPanel();
 					drawRoomMessage(curInv, _closeDataPtr);
 					_graphics->screenUpdate();
+
+					keymapper->getKeymap("inventory")->setEnabled(false);
+					keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+					keymapper->getKeymap("exit")->setEnabled(true);
 				}
 			} else {
 				_breadCrumbs[0]._crumbRoomNum = 0;
@@ -661,12 +709,15 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
 				_graphics->screenUpdate();
 			}
 		}
-	} else if ((code == Common::KEYCODE_x) || (code == Common::KEYCODE_q)) {
+	} else if ((code == kActionQuit)) {
 		// Quit?
 		_graphics->drawMessage("Do you want to quit? (Y/N)", false);
 		eatMessages();
 		interfaceOff();
 
+		keymapper->disableAllGameKeymaps();
+		keymapper->getKeymap("quit-dialog")->setEnabled(true);
+
 		while (1) {
 			// Make sure we check the music at least after every message
 			updateEvents();
@@ -679,21 +730,29 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
 				// Does music load and next animation frame when you've run out of messages
 				updateEvents();
 				_anim->diffNextFrame();
-			} else if (curMsg->_msgClass == kMessageRawKey) {
-				if ((curMsg->_code == Common::KEYCODE_y) || (curMsg->_code == Common::KEYCODE_q)) {
+			} else if (curMsg->_msgClass == kMessageAction) {
+				if ((curMsg->_code == kActionQuitDialogYes)) {
 					_anim->stopDiff();
 					return false;
-				} else if (curMsg->_code < 128)
+				} else if (curMsg->_code == kActionQuitDialogNo)
 					break;
 			} else if ((curMsg->_msgClass == kMessageLeftClick) || (curMsg->_msgClass == kMessageRightClick))
 				break;
 		}
 
+		keymapper->getKeymap("quit-dialog")->setEnabled(false);
+		keymapper->getKeymap("lab-default")->setEnabled(true);
+		if (_alternate) {
+			keymapper->getKeymap("inventory")->setEnabled(true);
+		} else {
+			keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+			keymapper->getKeymap("exit")->setEnabled(true);
+		}
 		forceDraw = true;
 		interfaceOn();
-	} else if (code == Common::KEYCODE_ESCAPE) {
+	} else if (code == kActionExit) {
 		_closeDataPtr = nullptr;
-	} else if (code == Common::KEYCODE_TAB) {
+	} else if (code == kActionFocusOnNextInteractiveItem) {
 		const CloseData *tmpClosePtr = _closeDataPtr;
 
 		// get next close-up in list after the one pointed to by curPos
@@ -709,6 +768,8 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
 }
 
 void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDirection, bool &forceDraw, uint16 buttonId, uint16 &actionMode) {
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+
 	switch (buttonId) {
 	case kButtonPickup:
 	case kButtonUse:
@@ -736,6 +797,10 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
 	case kButtonInventory:
 		eatMessages();
 
+		keymapper->getKeymap("game-shortcuts")->setEnabled(false);
+		keymapper->getKeymap("exit")->setEnabled(false);
+		keymapper->getKeymap("inventory")->setEnabled(true);
+
 		_alternate = true;
 		_anim->_doBlack = true;
 		// Sets the correct button list
@@ -852,6 +917,7 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
 
 void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonId, uint16 &actionMode) {
 	_anim->_doBlack = true;
+	Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
 
 	switch (buttonId) {
 	case kButtonMainDisplay:
@@ -864,6 +930,11 @@ void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonI
 		interfaceOn();
 		_graphics->drawPanel();
 		drawRoomMessage(curInv, _closeDataPtr);
+
+		keymapper->getKeymap("inventory")->setEnabled(false);
+		keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+		keymapper->getKeymap("exit")->setEnabled(true);
+
 		break;
 
 	case kButtonSaveLoad: {
@@ -954,6 +1025,10 @@ void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonI
 				interfaceOn();
 				_graphics->drawPanel();
 				drawRoomMessage(curInv, _closeDataPtr);
+
+				keymapper->getKeymap("inventory")->setEnabled(false);
+				keymapper->getKeymap("game-shortcuts")->setEnabled(true);
+				keymapper->getKeymap("exit")->setEnabled(true);
 			} else {
 				_breadCrumbs[0]._crumbRoomNum = 0;
 				_droppingCrumbs = false;
@@ -1054,6 +1129,10 @@ void LabEngine::go() {
 
 	// If the user has requested to load a game from the launcher, skip the intro
 	if (!ConfMan.hasKey("save_slot")) {
+		Common::Keymapper *keymapper = g_system->getEventManager()->getKeymapper();
+		keymapper->disableAllGameKeymaps();
+		keymapper->getKeymap("intro")->setEnabled(true);
+
 		_event->mouseHide();
 		_introPlaying = true;
 		Intro *intro = new Intro(this);
@@ -1061,6 +1140,11 @@ void LabEngine::go() {
 		delete intro;
 		_introPlaying = false;
 		_event->mouseShow();
+
+		keymapper->getKeymap("intro")->setEnabled(false);
+		keymapper->getKeymap("lab-default")->setEnabled(true);
+		keymapper->getKeymap("exit")->setEnabled(true);
+		keymapper->getKeymap("game-shortcuts")->setEnabled(true);
 	}
 
 	mainGameLoop();
diff --git a/engines/lab/eventman.cpp b/engines/lab/eventman.cpp
index bf50233862a..85008f08131 100644
--- a/engines/lab/eventman.cpp
+++ b/engines/lab/eventman.cpp
@@ -66,7 +66,7 @@ EventManager::EventManager(LabEngine *vm) : _vm(vm) {
 	_rightClick = false;
 	_buttonHit = false;
 	_mousePos = Common::Point(0, 0);
-	_keyPressed = Common::KEYCODE_INVALID;
+	_actionPressed = kActionNone;
 }
 
 void EventManager::initMouse() {
@@ -108,19 +108,22 @@ void EventManager::processInput() {
 		case Common::EVENT_MOUSEMOVE:
 			_mousePos = event.mouse;
 			break;
-		case Common::EVENT_KEYDOWN:
-			switch (event.kbd.keycode) {
-			case Common::KEYCODE_LEFTBRACKET:
+		case Common::EVENT_CUSTOM_ENGINE_ACTION_START:
+			switch (event.customType) {
+			case kActionSoundLower:
 				_vm->changeVolume(-1);
 				break;
-			case Common::KEYCODE_RIGHTBRACKET:
+			case kActionSoundRaise:
 				_vm->changeVolume(1);
 				break;
 			default:
-				_keyPressed = event.kbd;
+				_actionPressed = event.customType;
 				break;
 			}
 			break;
+		case Common::EVENT_KEYDOWN:
+			_actionPressed = kActionQuitDialogNo; // Used for "Press any key to continue" scenarios as well.
+			break;
 		case Common::EVENT_QUIT:
 		case Common::EVENT_RETURN_TO_LAUNCHER:
 		default:
@@ -142,7 +145,7 @@ IntuiMessage *EventManager::getMsg() {
 			_vm->_interface->handlePressedButton();
 			message._msgClass = kMessageButtonUp;
 			message._code = lastButtonHit->_buttonId;
-			message._qualifier = _keyPressed.flags;
+			message._qualifier = 0; // This does not seem to be used anywhere. Since qualifiers can be detected by keymapper anyways, this is set to 0.
 
 			return &message;
 		} else
@@ -153,21 +156,21 @@ IntuiMessage *EventManager::getMsg() {
 		message._mouse = _mousePos;
 		_leftClick = _rightClick = false;
 		return &message;
-	} else if (_keyPressed.keycode != Common::KEYCODE_INVALID) {
-		Button *curButton = _vm->_interface->checkNumButtonHit(_keyPressed.keycode);
+	} else if (_actionPressed != kActionNone) {
+		Button *curButton = _vm->_interface->checkNumButtonHit(_actionPressed);
 
 		if (curButton) {
 			message._msgClass = kMessageButtonUp;
 			message._code = curButton->_buttonId;
 		} else {
-			message._msgClass = kMessageRawKey;
-			message._code = _keyPressed.keycode;
+			message._msgClass = kMessageAction;
+			message._code = _actionPressed;
 		}
 
-		message._qualifier = _keyPressed.flags;
+		message._qualifier = 0; // This does not seem to be used anywhere. Since qualifiers can be detected by keymapper anyways, this is set to 0.
 		message._mouse = _mousePos;
 
-		_keyPressed.keycode = Common::KEYCODE_INVALID;
+		_actionPressed = kActionNone;
 
 		return &message;
 	} else
@@ -181,8 +184,8 @@ Common::Point EventManager::updateAndGetMousePos() {
 }
 
 void EventManager::simulateEvent() {
-	// Simulate an event by setting an unused key
-	_keyPressed = Common::KeyState(Common::KEYCODE_SEMICOLON);
+	// Simulate an event by setting an unused action.
+	_actionPressed = kActionDummy;
 }
 
 } // End of namespace Lab
diff --git a/engines/lab/eventman.h b/engines/lab/eventman.h
index b7823741c3d..dd0c40f4688 100644
--- a/engines/lab/eventman.h
+++ b/engines/lab/eventman.h
@@ -39,7 +39,7 @@ class Image;
 
 struct IntuiMessage {
 	MessageClass _msgClass;
-	uint16 _code; // KeyCode or Button Id
+	uint16 _code; // Action or Button Id
 	uint16 _qualifier;
 	Common::Point _mouse;
 };
@@ -53,7 +53,7 @@ private:
 	bool _buttonHit;
 
 	Common::Point _mousePos;
-	Common::KeyState _keyPressed;
+	Common::CustomEventType _actionPressed;
 
 public:
 	EventManager (LabEngine *vm);
diff --git a/engines/lab/interface.cpp b/engines/lab/interface.cpp
index c0e6ffa0eaf..9630a6795be 100644
--- a/engines/lab/interface.cpp
+++ b/engines/lab/interface.cpp
@@ -46,14 +46,14 @@ Interface::Interface(LabEngine *vm) : _vm(vm) {
 	_hitButton = nullptr;
 }
 
-Button *Interface::createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage) {
+Button *Interface::createButton(uint16 x, uint16 y, uint16 id, Common::CustomEventType action, Image *image, Image *altImage) {
 	Button *button = new Button();
 
 	if (button) {
 		button->_x = _vm->_utils->vgaScaleX(x);
 		button->_y = y;
 		button->_buttonId = id;
-		button->_keyEquiv = key;
+		button->_actionEquiv = action;
 		button->_image = image;
 		button->_altImage = altImage;
 		button->_isEnabled = true;
@@ -91,9 +91,7 @@ void Interface::toggleButton(Button *button, uint16 disabledPenColor, bool enabl
 	button->_isEnabled = enable;
 }
 
-Button *Interface::checkNumButtonHit(Common::KeyCode key) {
-	uint16 gkey = key - '0';
-
+Button *Interface::checkNumButtonHit(Common::CustomEventType action) {
 	if (!_screenButtonList)
 		return nullptr;
 
@@ -101,7 +99,7 @@ Button *Interface::checkNumButtonHit(Common::KeyCode key) {
 		if (!button->_isEnabled)
 			continue;
 
-		if ((gkey - 1 == button->_buttonId) || (gkey == 0 && button->_buttonId == 9) || (button->_keyEquiv != Common::KEYCODE_INVALID && key == button->_keyEquiv)) {
+		if ((button->_actionEquiv != kActionNone && action == button->_actionEquiv)) {
 			button->_altImage->drawImage(button->_x, button->_y);
 			_vm->_system->delayMillis(80);
 			button->_image->drawImage(button->_x, button->_y);
diff --git a/engines/lab/interface.h b/engines/lab/interface.h
index 364c90aec52..20435381f4b 100644
--- a/engines/lab/interface.h
+++ b/engines/lab/interface.h
@@ -39,7 +39,7 @@ class Image;
 
 struct Button {
 	uint16 _x, _y, _buttonId;
-	Common::KeyCode _keyEquiv; // the key which activates this button
+	Common::CustomEventType _actionEquiv; // the action which activates this button
 	bool _isEnabled;
 	Image *_image, *_altImage;
 };
@@ -57,7 +57,7 @@ public:
 	Interface(LabEngine *vm);
 
 	void attachButtonList(ButtonList *buttonList);
-	Button *createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage);
+	Button *createButton(uint16 x, uint16 y, uint16 id, Common::CustomEventType action, Image *image, Image *altImage);
 	void toggleButton(Button *button, uint16 penColor, bool enable);
 
 	/**
@@ -77,7 +77,7 @@ public:
 	* Checks whether or not the coords fall within one of the buttons in a list
 	* of buttons.
 	*/
-	Button *checkNumButtonHit(Common::KeyCode key);
+	Button *checkNumButtonHit(Common::CustomEventType action);
 
 	void handlePressedButton();
 
diff --git a/engines/lab/intro.cpp b/engines/lab/intro.cpp
index 97e3b7dde94..ea8021e32d2 100644
--- a/engines/lab/intro.cpp
+++ b/engines/lab/intro.cpp
@@ -63,7 +63,7 @@ void Intro::introEatMessages() {
 			return;
 
 		if ((msg->_msgClass == kMessageRightClick)
-		 || ((msg->_msgClass == kMessageRawKey) && (msg->_code == Common::KEYCODE_ESCAPE)))
+		 || ((msg->_msgClass == kMessageAction) && (msg->_code == kActionSkipIntro)))
 			_quitIntro = true;
 	}
 }
@@ -148,7 +148,7 @@ void Intro::doPictText(const Common::String &filename, bool isScreen) {
 			uint16 code = msg->_code;
 
 			if ((msgClass == kMessageRightClick) ||
-				((msgClass == kMessageRawKey) && (code == Common::KEYCODE_ESCAPE))) {
+				((msgClass == kMessageAction) && (code == kActionSkipIntro))) {
 				_quitIntro = true;
 
 				if (isScreen)
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index bff3a1a2675..2a5fcca87aa 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -113,7 +113,46 @@ enum MessageClass {
 	kMessageLeftClick,
 	kMessageRightClick,
 	kMessageButtonUp,
-	kMessageRawKey
+	kMessageAction
+};
+
+enum LABActions {
+	kActionNone,
+	kActionQuit,
+	kActionSkipIntro,
+	kActionSoundRaise,
+	kActionSoundLower,
+	kActionInteract,
+	kActionTake,
+	kActionMove,
+	kActionOpen,
+	kActionClose,
+	kActionLook,
+	kActionInv,
+	kActionForward,
+	kActionLeft,
+	kActionRight,
+	kActionMap,
+	kActionFocusOnNextInteractiveItem,
+	kActionExit,
+	kActionMainDisplay,
+	kActionSaveLoad,
+	kActionUse,
+	kActionInvLook,
+	kActionPrev,
+	kActionNext,
+	kActionDropBreadcrumb,
+	kActionFollowBreadcrumbs,
+	kActionRunWhileFollowingBreadcrumbs,
+	kActionMapExit,
+	kActionUpperFloor,
+	kActionLowerFloor,
+	kActionQuitDialogYes,
+	kActionQuitDialogNo,
+	kActionJournalBack,
+	kActionJournalExit,
+	kActionJournalForward,
+	kActionDummy,
 };
 
 class LabEngine : public Engine {
diff --git a/engines/lab/map.cpp b/engines/lab/map.cpp
index bc00006bc67..2ac696745f8 100644
--- a/engines/lab/map.cpp
+++ b/engines/lab/map.cpp
@@ -41,6 +41,8 @@
 #include "lab/resource.h"
 #include "lab/utils.h"
 
+#include "backends/keymapper/keymapper.h"
+
 namespace Lab {
 
 /*---------------------------------------------------------------------------*/
@@ -77,9 +79,9 @@ void LabEngine::loadMapData() {
 	_imgPath = new Image(mapImages, this);
 	_imgBridge = new Image(mapImages, this);
 
-	_mapButtonList.push_back(_interface->createButton( 8,  _utils->vgaScaleY(105), 0, Common::KEYCODE_ESCAPE, new Image(mapImages, this), new Image(mapImages, this)));	// back
-	_mapButtonList.push_back(_interface->createButton( 55, _utils->vgaScaleY(105), 1, Common::KEYCODE_UP,     new Image(mapImages, this), new Image(mapImages, this)));	// up
-	_mapButtonList.push_back(_interface->createButton(101, _utils->vgaScaleY(105), 2, Common::KEYCODE_DOWN,   new Image(mapImages, this), new Image(mapImages, this)));	// down
+	_mapButtonList.push_back(_interface->createButton( 8,  _utils->vgaScaleY(105), 0, kActionMapExit, new Image(mapImages, this), new Image(mapImages, this)));	// back
+	_mapButtonList.push_back(_interface->createButton( 55, _utils->vgaScaleY(105), 1, kActionUpperFloor,     new Image(mapImages, this), new Image(mapImages, this)));	// up
+	_mapButtonList.push_back(_interface->createButton(101, _utils->vgaScaleY(105), 2, kActionLowerFloor,   new Image(mapImages, this), new Image(mapImages, this)));	// down
 
 	delete mapImages;
 
@@ -427,7 +429,7 @@ void LabEngine::processMap(uint16 curRoom) {
 			uint16 mouseX    = msg->_mouse.x;
 			uint16 mouseY    = msg->_mouse.y;
 
-			if ((msgClass == kMessageRightClick) || ((msgClass == kMessageRawKey) && (msgCode == Common::KEYCODE_ESCAPE)))
+			if ((msgClass == kMessageRightClick) || ((msgClass == kMessageAction) && (msgCode == kActionExit)))
 				return;
 
 			if (msgClass == kMessageButtonUp) {
diff --git a/engines/lab/metaengine.cpp b/engines/lab/metaengine.cpp
index b09a52405b5..1f9eedf71a0 100644
--- a/engines/lab/metaengine.cpp
+++ b/engines/lab/metaengine.cpp
@@ -30,6 +30,12 @@
 #include "lab/lab.h"
 #include "engines/advancedDetector.h"
 
+#include "common/translation.h"
+
+#include "backends/keymapper/action.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/standard-actions.h"
+
 namespace Lab {
 
 Common::Platform LabEngine::getPlatform() const {
@@ -58,6 +64,7 @@ public:
 	int getMaximumSaveSlot() const override;
 	bool removeSaveState(const char *target, int slot) const override;
 	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
+	Common::KeymapArray initKeymaps(const char *target) const override;
 };
 
 bool LabMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -135,6 +142,289 @@ SaveStateDescriptor LabMetaEngine::querySaveMetaInfos(const char *target, int sl
 	return SaveStateDescriptor();
 }
 
+Common::KeymapArray LabMetaEngine::initKeymaps(const char *target) const {
+	using namespace Common;
+	using namespace Lab;
+
+	Keymap *engineKeymap = new Keymap(Keymap::kKeymapTypeGame, "lab-default", _("Default keymappings"));
+	Keymap *exitKeymap = new Keymap(Keymap::kKeymapTypeGame, "exit", _("Exit keymappings"));
+	Keymap *quitDialogKeymap = new Keymap(Keymap::kKeymapTypeGame, "quit-dialog", _("Quit dialog keymappings"));
+	Keymap *gameKeymap = new Keymap(Keymap::kKeymapTypeGame, "game-shortcuts", _("Game keymappings"));
+	Keymap *invKeymap = new Keymap(Keymap::kKeymapTypeGame, "inventory", _("Inventory keymappings"));
+	Keymap *introKeymap = new Keymap(Keymap::kKeymapTypeGame, "intro", _("Intro keymappings"));
+	Keymap *mapKeymap = new Keymap(Keymap::kKeymapTypeGame, "map", _("Map keymappings"));
+	Keymap *journalKeymap = new Keymap(Keymap::kKeymapTypeGame, "journal", _("Journal keymappings"));
+
+	Common::Action *act;
+
+	act = new Common::Action(kStandardActionLeftClick, _("Interact"));
+	act->setLeftClickEvent();
+	act->addDefaultInputMapping("MOUSE_LEFT");
+	act->addDefaultInputMapping("JOY_A");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action(kStandardActionRightClick, _("Exit"));
+	act->setRightClickEvent();
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("JOY_B");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("QUIT", _("Quit"));
+	act->setCustomEngineActionEvent(kActionQuit);
+	act->addDefaultInputMapping("q");
+	act->addDefaultInputMapping("x");
+	act->addDefaultInputMapping("JOY_DOWN");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("RAISESOUND", _("Raise the sound volume"));
+	act->setCustomEngineActionEvent(kActionSoundRaise);
+	act->addDefaultInputMapping("RIGHTBRACKET");
+	act->addDefaultInputMapping("JOY_LEFT_SHOULDER");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("LOWERSOUND", _("Lower the sound volume"));
+	act->setCustomEngineActionEvent(kActionSoundLower);
+	act->addDefaultInputMapping("LEFTBRACKET");
+	act->addDefaultInputMapping("JOY_RIGHT_SHOULDER");
+	engineKeymap->addAction(act);
+
+	act = new Common::Action("EXIT", _("Exit"));
+	act->setCustomEngineActionEvent(kActionExit);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_Y");
+	exitKeymap->addAction(act);
+
+	act = new Common::Action("YES", _("Yes"));
+	act->setCustomEngineActionEvent(kActionQuitDialogYes);
+	act->addDefaultInputMapping("y");
+	act->addDefaultInputMapping("q");
+	act->addDefaultInputMapping("JOY_A");
+	quitDialogKeymap->addAction(act);
+
+	act = new Common::Action("NO", _("No"));
+	act->setCustomEngineActionEvent(kActionQuitDialogNo);
+	act->addDefaultInputMapping("JOY_B");
+	quitDialogKeymap->addAction(act);
+
+	act = new Common::Action("SKIP_INTRO", _("Skip intro"));
+	act->setCustomEngineActionEvent(kActionSkipIntro);
+	act->addDefaultInputMapping("MOUSE_RIGHT");
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("JOY_X");
+	introKeymap->addAction(act);
+
+	act = new Common::Action("INTERACT", _("Interact with object with chosen action"));
+	act->setCustomEngineActionEvent(kActionInteract);
+	act->addDefaultInputMapping("RETURN");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("TAKE", _("Take object"));
+	act->setCustomEngineActionEvent(kActionTake);
+	act->addDefaultInputMapping("t");
+	act->addDefaultInputMapping("1");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("MOVE", _("Move or manipulate object"));
+	act->setCustomEngineActionEvent(kActionMove);
+	act->addDefaultInputMapping("m");
+	act->addDefaultInputMapping("2");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("OPEN", _("Open door or object"));
+	act->setCustomEngineActionEvent(kActionOpen);
+	act->addDefaultInputMapping("o");
+	act->addDefaultInputMapping("3");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("CLOSE", _("Close door or object"));
+	act->setCustomEngineActionEvent(kActionClose);
+	act->addDefaultInputMapping("c");
+	act->addDefaultInputMapping("4");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("LOOK", _("Look at object close-up"));
+	act->setCustomEngineActionEvent(kActionLook);
+	act->addDefaultInputMapping("l");
+	act->addDefaultInputMapping("5");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("INVENTORY", _("Switch to inventory display"));
+	act->setCustomEngineActionEvent(kActionInv);
+	act->addDefaultInputMapping("i");
+	act->addDefaultInputMapping("6");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("LEFT", _("Turn left"));
+	act->setCustomEngineActionEvent(kActionLeft);
+	act->addDefaultInputMapping("LEFT");
+	act->addDefaultInputMapping("7");
+	act->addDefaultInputMapping("JOY_LEFT");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("FORWARD", _("Walk forward"));
+	act->setCustomEngineActionEvent(kActionForward);
+	act->addDefaultInputMapping("UP");
+	act->addDefaultInputMapping("8");
+	act->addDefaultInputMapping("JOY_UP");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("RIGHT", _("Turn right"));
+	act->setCustomEngineActionEvent(kActionRight);
+	act->addDefaultInputMapping("RIGHT");
+	act->addDefaultInputMapping("9");
+	act->addDefaultInputMapping("JOY_RIGHT");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("MAP", _("Show map"));
+	act->setCustomEngineActionEvent(kActionMap);
+	act->addDefaultInputMapping("p");
+	act->addDefaultInputMapping("0");
+	gameKeymap->addAction(act);
+
+	act = new Common::Action("FOCUS", _("Move focus to interactive object"));
+	act->setCustomEngineActionEvent(kActionFocusOnNextInteractiveItem);
+	act->addDefaultInputMapping("TAB");
+	act->addDefaultInputMapping("JOY_X");
+	gameKeymap->addAction(act);
+
+	if (parsePlatform(ConfMan.get("platform")) == Common::kPlatformWindows) {
+
+		act = new Common::Action("STARTBREADCRUMB", _("Start dropping virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionDropBreadcrumb);
+		act->addDefaultInputMapping("b");
+		act->addDefaultInputMapping("JOY_LEFT_TRIGGER");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("FOLLOWBREADCRUMBS", _("Follow virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionFollowBreadcrumbs);
+		act->addDefaultInputMapping("f");
+		act->addDefaultInputMapping("JOY_RIGHT_TRIGGER");
+		gameKeymap->addAction(act);
+
+		act = new Common::Action("RUNFOLLOWINGBREADCRUMBS", _("Run while following virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionRunWhileFollowingBreadcrumbs);
+		act->addDefaultInputMapping("r");
+		act->addDefaultInputMapping("JOY_X");
+		gameKeymap->addAction(act);
+	}
+
+	act = new Common::Action("MAINDISPLAY", _("Switch to main display"));
+	act->setCustomEngineActionEvent(kActionMainDisplay);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("1");
+	invKeymap->addAction(act);
+
+	act = new Common::Action("SAVELOAD", _("Open save / load dialog"));
+	act->setCustomEngineActionEvent(kActionSaveLoad);
+	act->addDefaultInputMapping("g");
+	act->addDefaultInputMapping("2");
+	invKeymap->addAction(act);
+
+	act = new Common::Action("USE", _("Use"));
+	act->setCustomEngineActionEvent(kActionUse);
+	act->addDefaultInputMapping("u");
+	act->addDefaultInputMapping("3");
+	invKeymap->addAction(act);
+
+	act = new Common::Action("LOOKSCENE", _("Look at scene"));
+	act->setCustomEngineActionEvent(kActionInvLook);
+	act->addDefaultInputMapping("l");
+	act->addDefaultInputMapping("4");
+	invKeymap->addAction(act);
+
+	act = new Common::Action("PREV", _("Previous inventory item"));
+	act->setCustomEngineActionEvent(kActionPrev);
+	act->addDefaultInputMapping("LEFT");
+	act->addDefaultInputMapping("5");
+	act->addDefaultInputMapping("JOY_LEFT");
+	invKeymap->addAction(act);
+
+	act = new Common::Action("NEXT", _("Next inventory item"));
+	act->setCustomEngineActionEvent(kActionNext);
+	act->addDefaultInputMapping("RIGHT");
+	act->addDefaultInputMapping("6");
+	act->addDefaultInputMapping("JOY_RIGHT");
+	invKeymap->addAction(act);
+
+
+	if (parsePlatform(ConfMan.get("platform")) == Common::kPlatformWindows) {
+
+		act = new Common::Action("STARTBREADCRUMB", _("Start dropping virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionDropBreadcrumb);
+		act->addDefaultInputMapping("b");
+		act->addDefaultInputMapping("7");
+		act->addDefaultInputMapping("JOY_LEFT_TRIGGER");
+		invKeymap->addAction(act);
+
+		act = new Common::Action("FOLLOWBREADCRUMBS", _("Follow virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionFollowBreadcrumbs);
+		act->addDefaultInputMapping("f");
+		act->addDefaultInputMapping("8");
+		act->addDefaultInputMapping("JOY_RIGHT_TRIGGER");
+		invKeymap->addAction(act);
+
+		act = new Common::Action("RUNFOLLOWINGBREADCRUMBS", _("Run while following virtual bread crumbs"));
+		act->setCustomEngineActionEvent(kActionRunWhileFollowingBreadcrumbs);
+		act->addDefaultInputMapping("r");
+		act->addDefaultInputMapping("JOY_X");
+		invKeymap->addAction(act);
+	}
+
+	act = new Common::Action("EXITMAP", _("Exit map display"));
+	act->setCustomEngineActionEvent(kActionMapExit);
+	act->addDefaultInputMapping("ESCAPE");
+	act->addDefaultInputMapping("1");
+	mapKeymap->addAction(act);
+
+	act = new Common::Action("UPLEVEL", _("Up one level"));
+	act->setCustomEngineActionEvent(kActionUpperFloor);
+	act->addDefaultInputMapping("UP");
+	act->addDefaultInputMapping("2");
+	mapKeymap->addAction(act);
+
+	act = new Common::Action("DOWNLEVEL", _("Down one level"));
+	act->setCustomEngineActionEvent(kActionLowerFloor);
+	act->addDefaultInputMapping("DOWN");
+	act->addDefaultInputMapping("3");
+	mapKeymap->addAction(act);
+
+	act = new Common::Action("JOURNALBACK", _("Go back in journal"));
+	act->setCustomEngineActionEvent(kActionJournalBack);
+	act->addDefaultInputMapping("LEFT");
+	act->addDefaultInputMapping("1");
+	journalKeymap->addAction(act);
+
+	act = new Common::Action("EXITJOURNAL", _("Exit journal"));
+	act->setCustomEngineActionEvent(kActionJournalExit);
+	act->addDefaultInputMapping("2");
+	journalKeymap->addAction(act);
+
+	act = new Common::Action("JOURNALFORWARD", _("Go forward in journal"));
+	act->setCustomEngineActionEvent(kActionJournalForward);
+	act->addDefaultInputMapping("RIGHT");
+	act->addDefaultInputMapping("3");
+	journalKeymap->addAction(act);
+
+	KeymapArray keymaps(8);
+
+	keymaps[0] = engineKeymap;
+	keymaps[1] = exitKeymap;
+	keymaps[2] = gameKeymap;
+	keymaps[3] = invKeymap;
+	keymaps[4] = introKeymap;
+	keymaps[5] = mapKeymap;
+	keymaps[6] = quitDialogKeymap;
+	keymaps[7] = journalKeymap;
+
+	invKeymap->setEnabled(false);
+	introKeymap->setEnabled(false);
+	mapKeymap->setEnabled(false);
+	quitDialogKeymap->setEnabled(false);
+	journalKeymap->setEnabled(false);
+
+	return keymaps;
+}
+
 #if PLUGIN_ENABLED_DYNAMIC(LAB)
 	REGISTER_PLUGIN_DYNAMIC(LAB, PLUGIN_TYPE_ENGINE, LabMetaEngine);
 #else
diff --git a/engines/lab/special.cpp b/engines/lab/special.cpp
index e5966af270b..a4e73f5af62 100644
--- a/engines/lab/special.cpp
+++ b/engines/lab/special.cpp
@@ -130,9 +130,9 @@ void LabEngine::loadJournalData() {
 	_journalTextTitle = _resource->getText("Lab:Rooms/jt");
 
 	Common::File *journalFile = _resource->openDataFile("P:JImage");
-	_journalButtonList.push_back(_interface->createButton( 80, _utils->vgaScaleY(162) + _utils->svgaCord(1), 0,  Common::KEYCODE_LEFT,  new Image(journalFile, this), new Image(journalFile, this)));	// back
-	_journalButtonList.push_back(_interface->createButton(194, _utils->vgaScaleY(162) + _utils->svgaCord(1), 2,  Common::KEYCODE_RIGHT, new Image(journalFile, this), new Image(journalFile, this)));	// forward
-	_journalButtonList.push_back(_interface->createButton(144, _utils->vgaScaleY(164) - _utils->svgaCord(1), 1, Common::KEYCODE_ESCAPE, new Image(journalFile, this), new Image(journalFile, this)));	// cancel
+	_journalButtonList.push_back(_interface->createButton( 80, _utils->vgaScaleY(162) + _utils->svgaCord(1), 0,  kActionJournalBack,  new Image(journalFile, this), new Image(journalFile, this)));	// back
+	_journalButtonList.push_back(_interface->createButton(194, _utils->vgaScaleY(162) + _utils->svgaCord(1), 2,  kActionJournalForward, new Image(journalFile, this), new Image(journalFile, this)));	// forward
+	_journalButtonList.push_back(_interface->createButton(144, _utils->vgaScaleY(164) - _utils->svgaCord(1), 1, kActionJournalExit, new Image(journalFile, this), new Image(journalFile, this)));	// cancel
 	delete journalFile;
 
 	_anim->_noPalChange = true;
@@ -239,7 +239,7 @@ void LabEngine::processJournal() {
 		MessageClass msgClass  = msg->_msgClass;
 
 		if ((msgClass == kMessageRightClick) ||
-			((msgClass == kMessageRawKey) && (msg->_code == Common::KEYCODE_ESCAPE)))
+			((msgClass == kMessageAction) && (msg->_code == kActionExit)))
 			return;
 		else if (msgClass == kMessageButtonUp) {
 			uint16 buttonId  = msg->_code;
@@ -383,7 +383,7 @@ void LabEngine::processMonitor(const Common::String &ntext, TextFont *monitorFon
 		MessageClass msgClass  = msg->_msgClass;
 
 		if ((msgClass == kMessageRightClick) ||
-				((msgClass == kMessageRawKey) && (msg->_code == Common::KEYCODE_ESCAPE)))
+				((msgClass == kMessageAction) && (msg->_code == kActionExit)))
 			return;
 
 		if (msgClass == kMessageLeftClick) {




More information about the Scummvm-git-logs mailing list