[Scummvm-cvs-logs] SF.net SVN: scummvm:[48101] scummvm/trunk

bluddy at users.sourceforge.net bluddy at users.sourceforge.net
Sun Feb 21 05:04:14 CET 2010


Revision: 48101
          http://scummvm.svn.sourceforge.net/scummvm/?rev=48101&view=rev
Author:   bluddy
Date:     2010-02-21 04:04:13 +0000 (Sun, 21 Feb 2010)

Log Message:
-----------
Patch for bug 2943361 by littleboy, adding full kb modifier support to all engines + GUI and proper keypad handling

Modified Paths:
--------------
    scummvm/trunk/backends/events/default/default-events.cpp
    scummvm/trunk/backends/platform/sdl/events.cpp
    scummvm/trunk/backends/platform/sdl/sdl.cpp
    scummvm/trunk/backends/platform/sdl/sdl.h
    scummvm/trunk/common/keyboard.h
    scummvm/trunk/engines/agi/agi.cpp
    scummvm/trunk/engines/agi/preagi_troll.cpp
    scummvm/trunk/engines/agos/event.cpp
    scummvm/trunk/engines/cruise/cruise_main.cpp
    scummvm/trunk/engines/draci/draci.cpp
    scummvm/trunk/engines/gob/gob.cpp
    scummvm/trunk/engines/gob/util.cpp
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/kyra_v1.cpp
    scummvm/trunk/engines/lure/fights.cpp
    scummvm/trunk/engines/lure/game.cpp
    scummvm/trunk/engines/m4/events.cpp
    scummvm/trunk/engines/m4/mads_views.cpp
    scummvm/trunk/engines/parallaction/input.cpp
    scummvm/trunk/engines/queen/input.cpp
    scummvm/trunk/engines/saga/input.cpp
    scummvm/trunk/engines/saga/interface.cpp
    scummvm/trunk/engines/sci/event.cpp
    scummvm/trunk/engines/scumm/dialogs.cpp
    scummvm/trunk/engines/scumm/input.cpp
    scummvm/trunk/engines/sky/sky.cpp
    scummvm/trunk/engines/sword2/sword2.cpp
    scummvm/trunk/engines/teenagent/teenagent.cpp
    scummvm/trunk/engines/tinsel/tinsel.cpp
    scummvm/trunk/engines/touche/touche.cpp
    scummvm/trunk/engines/tucker/tucker.cpp
    scummvm/trunk/gui/ListWidget.cpp
    scummvm/trunk/gui/PopUpWidget.cpp
    scummvm/trunk/gui/console.cpp
    scummvm/trunk/gui/console.h
    scummvm/trunk/gui/editable.cpp
    scummvm/trunk/gui/editable.h

Modified: scummvm/trunk/backends/events/default/default-events.cpp
===================================================================
--- scummvm/trunk/backends/events/default/default-events.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/backends/events/default/default-events.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -103,7 +103,7 @@
 			_keyRepeatTime = time + kKeyRepeatInitialDelay;
 #endif
 			// Global Main Menu
-			if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == Common::KEYCODE_F5) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_F5) {
 				if (g_engine && !g_engine->isPaused()) {
 					Common::Event menuEvent;
 					menuEvent.type = Common::EVENT_MAINMENU;
@@ -135,7 +135,7 @@
 				}
 			}
 #ifdef ENABLE_VKEYBD
-			else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd.flags == 0) {
+			else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd.hasFlags(0)) {
 				if (_vk->isDisplaying()) {
 					_vk->close(true);
 				} else {
@@ -149,7 +149,7 @@
 			}
 #endif
 #ifdef ENABLE_KEYMAPPER
-			else if (event.kbd.keycode == Common::KEYCODE_F8 && event.kbd.flags == 0) {
+			else if (event.kbd.keycode == Common::KEYCODE_F8 && event.kbd.hasFlags(0)) {
 				if (!_remap) {
 					_remap = true;
 					Common::RemapDialog _remapDialog;

Modified: scummvm/trunk/backends/platform/sdl/events.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/events.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/backends/platform/sdl/events.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -152,23 +152,29 @@
 	}
 }
 
-static byte SDLModToOSystemKeyFlags(SDLMod mod) {
-	byte b = 0;
+static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) {
+
+	event.kbd.flags = 0;
+
 #ifdef LINUPY
 	// Yopy has no ALT key, steal the SHIFT key
 	// (which isn't used much anyway)
 	if (mod & KMOD_SHIFT)
-		b |= Common::KBD_ALT;
+		event.kbd.flags |= Common::KBD_ALT;
 #else
 	if (mod & KMOD_SHIFT)
-		b |= Common::KBD_SHIFT;
+		event.kbd.flags |= Common::KBD_SHIFT;
 	if (mod & KMOD_ALT)
-		b |= Common::KBD_ALT;
+		event.kbd.flags |= Common::KBD_ALT;
 #endif
 	if (mod & KMOD_CTRL)
-		b |= Common::KBD_CTRL;
+		event.kbd.flags |= Common::KBD_CTRL;
 
-	return b;
+	// Sticky flags
+	if (mod & KMOD_NUM)
+		event.kbd.flags |= Common::KBD_NUM;
+	if (mod & KMOD_CAPS)
+		event.kbd.flags |= Common::KBD_CAPS;
 }
 
 bool OSystem_SDL::pollEvent(Common::Event &event) {
@@ -225,12 +231,18 @@
 
 
 bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) {
-	byte b = 0;
-	b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
 
+	SDLModToOSystemKeyFlags(SDL_GetModState(), event);
+
+	// Handle scroll lock as a key modifier
+	if (ev.key.keysym.sym == SDLK_SCROLLOCK)
+		_scrollLock = !_scrollLock;
+
+	if (_scrollLock)
+		event.kbd.flags |= Common::KBD_SCRL;
+
 	// Alt-Return and Alt-Enter toggle full screen mode
-	if (b == Common::KBD_ALT && (ev.key.keysym.sym == SDLK_RETURN
-					  || ev.key.keysym.sym == SDLK_KP_ENTER)) {
+	if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) {
 		beginGFXTransaction();
 			setFullscreenMode(!_videoMode.fullscreen);
 		endGFXTransaction();
@@ -245,7 +257,7 @@
 	}
 
 	// Alt-S: Create a screenshot
-	if (b == Common::KBD_ALT && ev.key.keysym.sym == 's') {
+	if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') {
 		char filename[20];
 
 		for (int n = 0;; n++) {
@@ -265,7 +277,7 @@
 	}
 
 	// Ctrl-m toggles mouse capture
-	if (b == Common::KBD_CTRL && ev.key.keysym.sym == 'm') {
+	if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') {
 		toggleMouseGrab();
 		return false;
 	}
@@ -284,7 +296,7 @@
 	}
 #else
 	// Ctrl-z and Alt-X quit
-	if ((b == Common::KBD_CTRL && ev.key.keysym.sym == 'z') || (b == Common::KBD_ALT && ev.key.keysym.sym == 'x')) {
+	if ((event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'z') || (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 'x')) {
 		event.type = Common::EVENT_QUIT;
 		return true;
 	}
@@ -296,7 +308,7 @@
 	}
 
 	// Ctrl-Alt-<key> will change the GFX mode
-	if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
+	if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
 		if (handleScalerHotkeys(ev.key))
 			return false;
 	}
@@ -320,8 +332,13 @@
 	event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
 
 	// Ctrl-Alt-<key> will change the GFX mode
-	byte b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
-	if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
+	SDLModToOSystemKeyFlags(SDL_GetModState(), event);
+
+	// Set the scroll lock sticky flag
+	if (_scrollLock)
+		event.kbd.flags |= Common::KBD_SCRL;
+
+	if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
 		// Swallow these key up events
 		return false;
 	}

Modified: scummvm/trunk/backends/platform/sdl/sdl.cpp
===================================================================
--- scummvm/trunk/backends/platform/sdl/sdl.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/backends/platform/sdl/sdl.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -232,6 +232,7 @@
 	_overlayscreen(0), _tmpscreen2(0),
 	_samplesPerSec(0),
 	_cdrom(0), _scalerProc(0), _modeChanged(false), _screenChangeCount(0), _dirtyChecksums(0),
+	_scrollLock(false),
 	_mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0),
 	_mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true),
 	_joystick(0),

Modified: scummvm/trunk/backends/platform/sdl/sdl.h
===================================================================
--- scummvm/trunk/backends/platform/sdl/sdl.h	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/backends/platform/sdl/sdl.h	2010-02-21 04:04:13 UTC (rev 48101)
@@ -412,6 +412,9 @@
 		kMouseColorKey = 1
 	};
 
+	// Scroll lock state - since SDL doesn't track it
+	bool _scrollLock;
+	
 	// joystick
 	SDL_Joystick *_joystick;
 

Modified: scummvm/trunk/common/keyboard.h
===================================================================
--- scummvm/trunk/common/keyboard.h	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/common/keyboard.h	2010-02-21 04:04:13 UTC (rev 48101)
@@ -40,15 +40,15 @@
 	KEYCODE_PAUSE       = 19,
 	KEYCODE_ESCAPE      = 27,
 	KEYCODE_SPACE       = 32,
-	KEYCODE_EXCLAIM     = 33,
-	KEYCODE_QUOTEDBL    = 34,
-	KEYCODE_HASH        = 35,
-	KEYCODE_DOLLAR      = 36,
-	KEYCODE_AMPERSAND   = 38,
-	KEYCODE_QUOTE       = 39,
+	KEYCODE_EXCLAIM     = 33,      // !
+	KEYCODE_QUOTEDBL    = 34,      // "
+	KEYCODE_HASH        = 35,      // #
+	KEYCODE_DOLLAR      = 36,      // $
+	KEYCODE_AMPERSAND   = 38,      // &
+	KEYCODE_QUOTE       = 39,      // '
 	KEYCODE_LEFTPAREN   = 40,
 	KEYCODE_RIGHTPAREN  = 41,
-	KEYCODE_ASTERISK    = 42,
+	KEYCODE_ASTERISK    = 42,      // *
 	KEYCODE_PLUS        = 43,
 	KEYCODE_COMMA       = 44,
 	KEYCODE_MINUS       = 45,
@@ -105,6 +105,7 @@
 	KEYCODE_y           = 121,
 	KEYCODE_z           = 122,
 	KEYCODE_DELETE      = 127,
+	KEYCODE_TILDE       = 176,      // ~
 
 	// Numeric keypad
 	KEYCODE_KP0         = 256,
@@ -215,7 +216,10 @@
 enum {
 	KBD_CTRL  = 1 << 0,
 	KBD_ALT   = 1 << 1,
-	KBD_SHIFT = 1 << 2
+	KBD_SHIFT = 1 << 2,
+	KBD_NUM   = 1 << 3,
+	KBD_CAPS  = 1 << 4,
+	KBD_SCRL  = 1 << 5
 };
 
 /**
@@ -245,7 +249,7 @@
 	/**
 	 * Status of the modifier keys. Bits are set in this for each
 	 * pressed modifier
-	 * @see KBD_CTRL, KBD_ALT, KBD_SHIFT
+	 * @see KBD_CTRL, KBD_ALT, KBD_SHIFT, KBD_NUM, KBD_CAPS, KBD_SCRL
 	 */
 	byte flags;
 
@@ -266,6 +270,13 @@
 		ascii = flags = 0;
 	}
 
+	/**
+	 * Check for flags, ignoring the sticky flags (KBD_NUM, KBD_CAPS, KBD_SCRL)
+	 */
+	bool hasFlags(byte f) {
+		return f == (flags & ~(KBD_NUM|KBD_CAPS|KBD_SCRL));
+	}
+
 	bool operator ==(const KeyState &x) const {
 		return keycode == x.keycode && ascii == x.ascii && flags == x.flags;
 	}

Modified: scummvm/trunk/engines/agi/agi.cpp
===================================================================
--- scummvm/trunk/engines/agi/agi.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/agi/agi.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -121,7 +121,7 @@
 			_mouse.y = event.mouse.y;
 			break;
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == Common::KEYCODE_d) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_d) {
 				_console->attach();
 				break;
 			}

Modified: scummvm/trunk/engines/agi/preagi_troll.cpp
===================================================================
--- scummvm/trunk/engines/agi/preagi_troll.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/agi/preagi_troll.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -104,7 +104,7 @@
 				case Common::KEYCODE_KP_ENTER:
 					return true;
 				case Common::KEYCODE_s:
-					if (event.kbd.flags == Common::KBD_CTRL) {
+					if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 						if (_soundOn) {
 							playTune(2, 1);
 							_soundOn = !_soundOn;

Modified: scummvm/trunk/engines/agos/event.cpp
===================================================================
--- scummvm/trunk/engines/agos/event.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/agos/event.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -459,8 +459,8 @@
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
 				if (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9
-					&& (event.kbd.flags == Common::KBD_ALT ||
-						event.kbd.flags == Common::KBD_CTRL)) {
+					&& (event.kbd.hasFlags(Common::KBD_ALT) ||
+						event.kbd.hasFlags(Common::KBD_CTRL))) {
 					_saveLoadSlot = event.kbd.keycode - Common::KEYCODE_0;
 
 					// There is no save slot 0
@@ -469,13 +469,13 @@
 
 					memset(_saveLoadName, 0, sizeof(_saveLoadName));
 					sprintf(_saveLoadName, "Quick %d", _saveLoadSlot);
-					_saveLoadType = (event.kbd.flags == Common::KBD_ALT) ? 1 : 2;
+					_saveLoadType = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2;
 
 					// We should only allow a load or save when it was possible in original
 					// This stops load/save during copy protection, conversations and cut scenes
 					if (!_mouseHideCount && !_showPreposition)
 						quickLoadOrSave();
-				} else if (event.kbd.flags == Common::KBD_CTRL) {
+				} else if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 					if (event.kbd.keycode == Common::KEYCODE_a) {
 						GUI::Dialog *_aboutDialog;
 						_aboutDialog = new GUI::AboutDialog();
@@ -492,7 +492,7 @@
 				}
 
 				if (getGameType() == GType_PP) {
-					if (event.kbd.flags == Common::KBD_SHIFT)
+					if (event.kbd.hasFlags(Common::KBD_SHIFT))
 						_variableArray[41] = 0;
 					else
 						_variableArray[41] = 1;

Modified: scummvm/trunk/engines/cruise/cruise_main.cpp
===================================================================
--- scummvm/trunk/engines/cruise/cruise_main.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/cruise/cruise_main.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -1759,7 +1759,7 @@
 				break;
 			}
 
-			if (event.kbd.flags == Common::KBD_CTRL) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if (event.kbd.keycode == Common::KEYCODE_d) {
 					// Start the debugger
 					_vm->getDebugger()->attach();

Modified: scummvm/trunk/engines/draci/draci.cpp
===================================================================
--- scummvm/trunk/engines/draci/draci.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/draci/draci.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -293,7 +293,7 @@
 				}
 				break;
 			case Common::KEYCODE_F5:
-				if (event.kbd.flags == 0) {
+				if (event.kbd.hasFlags(0)) {
 					openMainMenuDialog();
 				}
 				break;

Modified: scummvm/trunk/engines/gob/gob.cpp
===================================================================
--- scummvm/trunk/engines/gob/gob.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/gob/gob.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -109,7 +109,7 @@
 
 void PauseDialog::handleKeyDown(Common::KeyState state) {
 	// Close on CTRL+p
-	if ((state.flags == Common::KBD_CTRL) && (state.keycode == Common::KEYCODE_p))
+	if ((state.hasFlags(Common::KBD_CTRL)) && (state.keycode == Common::KEYCODE_p))
 		close();
 }
 

Modified: scummvm/trunk/engines/gob/util.cpp
===================================================================
--- scummvm/trunk/engines/gob/util.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/gob/util.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -114,7 +114,7 @@
 			_mouseButtons = (MouseButtons) (((uint32) _mouseButtons) & ~((uint32) kMouseButtonsRight));
 			break;
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.flags == Common::KBD_CTRL) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if (event.kbd.keycode == Common::KEYCODE_f)
 					_fastMode ^= 1;
 				else if (event.kbd.keycode == Common::KEYCODE_g)

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/kyra/gui.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -421,7 +421,7 @@
 	while (_vm->_eventMan->pollEvent(event) && running) {
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.flags == Common::KBD_CTRL)
+			if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.hasFlags(Common::KBD_CTRL))
 				_vm->quitGame();
 			else
 				_keyPressed = event.kbd;

Modified: scummvm/trunk/engines/kyra/kyra_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v1.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/kyra/kyra_v1.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -262,10 +262,10 @@
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
 			if (event.kbd.keycode >= Common::KEYCODE_1 && event.kbd.keycode <= Common::KEYCODE_9 &&
-					(event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && mainLoop) {
+					(event.kbd.hasFlags(Common::KBD_CTRL) || event.kbd.hasFlags(Common::KBD_ALT)) && mainLoop) {
 				int saveLoadSlot = 9 - (event.kbd.keycode - Common::KEYCODE_0) + 990;
 
-				if (event.kbd.flags == Common::KBD_CTRL) {
+				if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 					if (saveFileLoadable(saveLoadSlot))
 						loadGameStateCheck(saveLoadSlot);
 					_eventList.clear();
@@ -275,7 +275,7 @@
 					sprintf(savegameName, "Quicksave %d", event.kbd.keycode - Common::KEYCODE_0);
 					saveGameState(saveLoadSlot, savegameName, 0);
 				}
-			} else if (event.kbd.flags == Common::KBD_CTRL) {
+			} else if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if (event.kbd.keycode == Common::KEYCODE_d) {
 					if (_debugger)
 						_debugger->attach();
@@ -385,7 +385,7 @@
 				event.kbd.keycode == Common::KEYCODE_UP || event.kbd.keycode == Common::KEYCODE_RIGHT ||
 				event.kbd.keycode == Common::KEYCODE_DOWN || event.kbd.keycode == Common::KEYCODE_LEFT)
 					_eventList.push_back(Event(event, true));
-			else if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.flags == Common::KBD_CTRL)
+			else if (event.kbd.keycode == Common::KEYCODE_q && event.kbd.hasFlags(Common::KBD_CTRL))
 				quitGame();
 			else
 				_eventList.push_back(event);

Modified: scummvm/trunk/engines/lure/fights.cpp
===================================================================
--- scummvm/trunk/engines/lure/fights.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/lure/fights.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -205,7 +205,7 @@
 				return;
 
 			case Common::KEYCODE_d:
-				if (events.event().kbd.flags == Common::KBD_CTRL) {
+				if (events.event().kbd.hasFlags(Common::KBD_CTRL)) {
 					// Activate the debugger
 					game.debugger().attach();
 					return;

Modified: scummvm/trunk/engines/lure/game.cpp
===================================================================
--- scummvm/trunk/engines/lure/game.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/lure/game.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -195,7 +195,7 @@
 				if (events.type() == Common::EVENT_KEYDOWN) {
 					uint16 roomNum = room.roomNumber();
 
-					if ((events.event().kbd.flags == Common::KBD_CTRL) &&
+					if ((events.event().kbd.hasFlags(Common::KBD_CTRL)) &&
 						(events.event().kbd.keycode == Common::KEYCODE_d)) {
 						// Activate the debugger
 						_debugger->attach();

Modified: scummvm/trunk/engines/m4/events.cpp
===================================================================
--- scummvm/trunk/engines/m4/events.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/m4/events.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -73,7 +73,7 @@
 			if ((_event.kbd.keycode == Common::KEYCODE_LCTRL) || (_event.kbd.keycode == Common::KEYCODE_RCTRL))
 				_ctrlFlag = true;
 
-			else if (_event.kbd.flags == Common::KBD_CTRL) {
+			else if (_event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if ((_event.kbd.keycode == Common::KEYCODE_d) && _ctrlFlag) {
 					_console->attach();
 					_console->onFrame();

Modified: scummvm/trunk/engines/m4/mads_views.cpp
===================================================================
--- scummvm/trunk/engines/m4/mads_views.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/m4/mads_views.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -362,7 +362,7 @@
 
 	// Capitalise the letter if necessary
 	if (_cheatKeyCtr < CHEAT_SEQUENCE_MAX) {
-		if ((flags == Common::KBD_CTRL) && (kc == CHEAT_SEQUENCE[_cheatKeyCtr])) {
+		if ((flags & Common::KBD_CTRL) && (kc == CHEAT_SEQUENCE[_cheatKeyCtr])) {
 			++_cheatKeyCtr;
 			if (_cheatKeyCtr == CHEAT_SEQUENCE_MAX)
 				Dialog::display(_vm, 22, cheatingEnabledDesc);

Modified: scummvm/trunk/engines/parallaction/input.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/input.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/parallaction/input.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -111,7 +111,7 @@
 			_hasKeyPressEvent = true;
 			_keyPressed = e.kbd;
 
-			if (e.kbd.flags == Common::KBD_CTRL && e.kbd.keycode == 'd')
+			if (e.kbd.hasFlags(Common::KBD_CTRL) && e.kbd.keycode == Common::KEYCODE_d)
 				_vm->_debugger->attach();
 
 			updateMousePos = false;

Modified: scummvm/trunk/engines/queen/input.cpp
===================================================================
--- scummvm/trunk/engines/queen/input.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/queen/input.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -100,10 +100,10 @@
 			_idleTime = 0;
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
-				if (event.kbd.flags == Common::KBD_CTRL) {
-					if (event.kbd.keycode == 'd') {
+				if (event.kbd.hasFlags(Common::KBD_CTRL)) {
+					if (event.kbd.keycode == Common::KEYCODE_d) {
 						_debugger = true;
-					} else if (event.kbd.keycode == 'f') {
+					} else if (event.kbd.keycode == Common::KEYCODE_f) {
 						_fastMode = !_fastMode;
 					}
 				} else {

Modified: scummvm/trunk/engines/saga/input.cpp
===================================================================
--- scummvm/trunk/engines/saga/input.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/saga/input.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -44,7 +44,7 @@
 	while (_eventMan->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.flags == Common::KBD_CTRL) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if (event.kbd.keycode == Common::KEYCODE_d)
 					_console->attach();
 			}
@@ -56,7 +56,7 @@
 			switch (event.kbd.keycode) {
 			case Common::KEYCODE_HASH:
 			case Common::KEYCODE_BACKQUOTE:
-			case Common::KEYCODE_QUOTE: // tilde ("~")
+			case Common::KEYCODE_TILDE: // tilde ("~")
 				_console->attach();
 				break;
 			case Common::KEYCODE_r:

Modified: scummvm/trunk/engines/saga/interface.cpp
===================================================================
--- scummvm/trunk/engines/saga/interface.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/saga/interface.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -651,7 +651,7 @@
 				return true;
 			}
 		}
-		if (keystate.keycode == Common::KEYCODE_o && keystate.flags == Common::KBD_CTRL) { // ctrl-o
+		if (keystate.keycode == Common::KEYCODE_o && keystate.hasFlags(Common::KBD_CTRL)) { // ctrl-o
 			if (_saveReminderState > 0) {
 				setMode(kPanelOption);
 				return true;

Modified: scummvm/trunk/engines/sci/event.cpp
===================================================================
--- scummvm/trunk/engines/sci/event.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/sci/event.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -120,50 +120,15 @@
 		int modifiers = em->getModifierState();
 
 		// We add the modifier key status to buckybits
-		// SDL sends a keydown event if a modifier key is turned on and a keyup event if it's off
-		//
-		// FIXME: This code is semi-bogus. It only records the modifier key being *pressed*.
-		// It does not track correctly whether capslock etc. is active. To do that, we
-		// would have to record the fact that the modifier was pressed in global var,
-		// and also watch for Common::EVENT_KEYUP events.
-		// But this is still not quite good enough, because not all events might
-		// pass through here (e.g. the GUI might be running with its own event loop).
-		//
-		// The best solution likely would be to add code to the EventManager class
-		// for tracking which keys are pressed and which are not...
-		if (ev.type == Common::EVENT_KEYDOWN || ev.type == Common::EVENT_KEYUP) {
-			switch (ev.kbd.keycode) {
-			case Common::KEYCODE_CAPSLOCK:
-				if (ev.type == Common::EVENT_KEYDOWN) {
-					_modifierStates |= SCI_KEYMOD_CAPSLOCK;
-				} else {
-					_modifierStates &= ~SCI_KEYMOD_CAPSLOCK;
-				}
-				break;
-			case Common::KEYCODE_NUMLOCK:
-				if (ev.type == Common::EVENT_KEYDOWN) {
-					_modifierStates |= SCI_KEYMOD_NUMLOCK;
-				} else {
-					_modifierStates &= ~SCI_KEYMOD_NUMLOCK;
-				}
-				break;
-			case Common::KEYCODE_SCROLLOCK:
-				if (ev.type == Common::EVENT_KEYDOWN) {
-					_modifierStates |= SCI_KEYMOD_SCRLOCK;
-				} else {
-					_modifierStates &= ~SCI_KEYMOD_SCRLOCK;
-				}
-				break;
-			default:
-				break;
-			}
-		}
 		//TODO: SCI_EVM_INSERT
 
 		input.modifiers =
 		    ((modifiers & Common::KBD_ALT) ? SCI_KEYMOD_ALT : 0) |
 		    ((modifiers & Common::KBD_CTRL) ? SCI_KEYMOD_CTRL : 0) |
 		    ((modifiers & Common::KBD_SHIFT) ? SCI_KEYMOD_LSHIFT | SCI_KEYMOD_RSHIFT : 0) |
+		    ((ev.kbd.flags & Common::KBD_NUM) ? SCI_KEYMOD_NUMLOCK : 0) |
+		    ((ev.kbd.flags & Common::KBD_CAPS) ? SCI_KEYMOD_CAPSLOCK : 0) |
+			((ev.kbd.flags & Common::KBD_SCRL) ? SCI_KEYMOD_SCRLOCK : 0) |
 			_modifierStates;
 
 		switch (ev.type) {
@@ -173,7 +138,7 @@
 			input.character = ev.kbd.ascii;
 
 			// Debug console
-			if (ev.kbd.flags == Common::KBD_CTRL && ev.kbd.keycode == Common::KEYCODE_d) {
+			if (ev.kbd.hasFlags(Common::KBD_CTRL) && ev.kbd.keycode == Common::KEYCODE_d) {
 				// Open debug console
 				Console *con = g_sci->getSciDebugger();
 				con->attach();

Modified: scummvm/trunk/engines/scumm/dialogs.cpp
===================================================================
--- scummvm/trunk/engines/scumm/dialogs.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/scumm/dialogs.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -725,7 +725,7 @@
 }
 
 void SubtitleSettingsDialog::handleKeyDown(Common::KeyState state) {
-	if (state.keycode == 't' && state.flags == Common::KBD_CTRL) {
+	if (state.keycode == Common::KEYCODE_t && state.hasFlags(Common::KBD_CTRL)) {
 		cycleValue();
 
 		reflowLayout();

Modified: scummvm/trunk/engines/scumm/input.cpp
===================================================================
--- scummvm/trunk/engines/scumm/input.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/scumm/input.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -110,26 +110,26 @@
 void ScummEngine::parseEvent(Common::Event event) {
 	switch (event.type) {
 	case Common::EVENT_KEYDOWN:
-		if (event.kbd.keycode >= '0' && event.kbd.keycode <= '9' &&
-			((event.kbd.flags == Common::KBD_ALT && canSaveGameStateCurrently()) ||
-			(event.kbd.flags == Common::KBD_CTRL && canLoadGameStateCurrently()))) {
-			_saveLoadSlot = event.kbd.keycode - '0';
+		if (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9 &&
+			((event.kbd.hasFlags(Common::KBD_ALT) && canSaveGameStateCurrently()) ||
+			(event.kbd.hasFlags(Common::KBD_CTRL) && canLoadGameStateCurrently()))) {
+			_saveLoadSlot = event.kbd.keycode - Common::KEYCODE_0;
 
 			//  don't overwrite autosave (slot 0)
 			if (_saveLoadSlot == 0)
 				_saveLoadSlot = 10;
 
 			sprintf(_saveLoadName, "Quicksave %d", _saveLoadSlot);
-			_saveLoadFlag = (event.kbd.flags == Common::KBD_ALT) ? 1 : 2;
+			_saveLoadFlag = (event.kbd.hasFlags(Common::KBD_ALT)) ? 1 : 2;
 			_saveTemporaryState = false;
-		} else if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 'f') {
+		} else if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_f) {
 			_fastMode ^= 1;
-		} else if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 'g') {
+		} else if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_g) {
 			_fastMode ^= 2;
-		} else if ((event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 'd') ||
-				event.kbd.ascii == '~' || event.kbd.ascii == '#') {
+		} else if ((event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_d)
+		        || event.kbd.ascii == '~' || event.kbd.ascii == '#') {
 			_debugger->attach();
-		} else if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 's') {
+		} else if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_s) {
 			_res->resourceStats();
 		} else {
 			// Normal key press, pass on to the game.
@@ -355,12 +355,12 @@
 #ifdef ENABLE_SCUMM_7_8
 void ScummEngine_v8::processKeyboard(Common::KeyState lastKeyHit) {
 	// F1 (the trigger for the original save/load dialog) is mapped to F5
-	if (!(_game.features & GF_DEMO) && lastKeyHit.keycode == Common::KEYCODE_F1 && lastKeyHit.flags == 0) {
+	if (!(_game.features & GF_DEMO) && lastKeyHit.keycode == Common::KEYCODE_F1 && lastKeyHit.hasFlags(0)) {
 		lastKeyHit = Common::KeyState(Common::KEYCODE_F5, 319);
 	}
 
 	// Alt-F5 should bring up the original save/load dialog, so map it to F1.
-	if (!(_game.features & GF_DEMO) && lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.flags == Common::KBD_ALT) {
+	if (!(_game.features & GF_DEMO) && lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.hasFlags(Common::KBD_ALT)) {
 		lastKeyHit = Common::KeyState(Common::KEYCODE_F1, 315);
 	}
 
@@ -383,7 +383,7 @@
 	// version string is hard coded in the engine, hence we don't invoke
 	// versionDialog for it. Dig/FT version strings are partly hard coded, too.
 	if (_game.id != GID_CMI && 0 != VAR(VAR_VERSION_KEY) &&
-	    lastKeyHit.keycode == Common::KEYCODE_v && lastKeyHit.flags == Common::KBD_CTRL) {
+	    lastKeyHit.keycode == Common::KEYCODE_v && lastKeyHit.hasFlags(Common::KBD_CTRL)) {
 		versionDialog();
 
 	} else if (cutsceneExitKeyEnabled && lastKeyHit.keycode == Common::KEYCODE_ESCAPE) {
@@ -408,7 +408,7 @@
 #endif
 
 void ScummEngine_v6::processKeyboard(Common::KeyState lastKeyHit) {
-	if (lastKeyHit.keycode == Common::KEYCODE_t && lastKeyHit.flags == Common::KBD_CTRL) {
+	if (lastKeyHit.keycode == Common::KEYCODE_t && lastKeyHit.hasFlags(Common::KBD_CTRL)) {
 		SubtitleSettingsDialog dialog(this, _voiceMode);
 		_voiceMode = runDialog(dialog);
 
@@ -442,7 +442,7 @@
 	ScummEngine::processKeyboard(lastKeyHit);
 
 	// On Alt-F5 prepare savegame for the original save/load dialog.
-	if (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.flags == Common::KBD_ALT) {
+	if (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.hasFlags(Common::KBD_ALT)) {
 		prepareSavegame();
 		if (_game.id == GID_MANIAC && _game.version == 0) {
 			runScript(2, 0, 0, 0);
@@ -467,7 +467,7 @@
 	ScummEngine::processKeyboard(lastKeyHit);
 
 	// On Alt-F5 prepare savegame for the original save/load dialog.
-	if (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.flags == Common::KBD_ALT) {
+	if (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.hasFlags(Common::KBD_ALT)) {
 		prepareSavegame();
 	}
 
@@ -504,7 +504,7 @@
 	if (_game.id == GID_CMI)
 		mainmenuKeyEnabled = true;
 
-	if (mainmenuKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.flags == 0)) {
+	if (mainmenuKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_F5 && lastKeyHit.hasFlags(0))) {
 		if (VAR_SAVELOAD_SCRIPT != 0xFF && _currentRoom != 0)
 			runScript(VAR(VAR_SAVELOAD_SCRIPT), 0, 0, 0);
 
@@ -513,25 +513,25 @@
 		if (VAR_SAVELOAD_SCRIPT != 0xFF && _currentRoom != 0)
 			runScript(VAR(VAR_SAVELOAD_SCRIPT2), 0, 0, 0);
 
-	} else if (restartKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_F8 && lastKeyHit.flags == 0)) {
+	} else if (restartKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_F8 && lastKeyHit.hasFlags(0))) {
 		confirmRestartDialog();
 
-	} else if (pauseKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_SPACE && lastKeyHit.flags == 0)) {
+	} else if (pauseKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_SPACE && lastKeyHit.hasFlags(0))) {
 		pauseGame();
 
-	} else if (talkstopKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_PERIOD && lastKeyHit.flags == 0)) {
+	} else if (talkstopKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_PERIOD && lastKeyHit.hasFlags(0))) {
 		_talkDelay = 0;
 		if (_sound->_sfxMode & 2)
 			stopTalk();
 
-	} else if (cutsceneExitKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_ESCAPE && lastKeyHit.flags == 0)) {
+	} else if (cutsceneExitKeyEnabled && (lastKeyHit.keycode == Common::KEYCODE_ESCAPE && lastKeyHit.hasFlags(0))) {
 		abortCutscene();
 
 		// VAR_CUTSCENEEXIT_KEY doesn't exist in SCUMM0
 		if (VAR_CUTSCENEEXIT_KEY != 0xFF)
 			_mouseAndKeyboardStat = VAR(VAR_CUTSCENEEXIT_KEY);
 	} else if (snapScrollKeyEnabled && lastKeyHit.keycode == Common::KEYCODE_r &&
-		lastKeyHit.flags == Common::KBD_CTRL) {
+		lastKeyHit.hasFlags(Common::KBD_CTRL)) {
 		_snapScroll ^= 1;
 		if (_snapScroll) {
 			messageDialog("Snap scroll on");

Modified: scummvm/trunk/engines/sky/sky.cpp
===================================================================
--- scummvm/trunk/engines/sky/sky.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/sky/sky.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -113,12 +113,12 @@
 		_skySound->fnUnPauseFx();
 		_systemVars.paused = false;
 		_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
-	} else if (_keyPressed.flags == Common::KBD_CTRL) {
-		if (_keyPressed.keycode == 'f')
+	} else if (_keyPressed.hasFlags(Common::KBD_CTRL)) {
+		if (_keyPressed.keycode == Common::KEYCODE_f)
 			_fastMode ^= 1;
-		else if (_keyPressed.keycode == 'g')
+		else if (_keyPressed.keycode == Common::KEYCODE_g)
 			_fastMode ^= 2;
-		else if (_keyPressed.keycode == 'd')
+		else if (_keyPressed.keycode == Common::KEYCODE_d)
 			_debugger->attach();
 	} else if (_keyPressed.keycode) {
 		switch (_keyPressed.keycode) {

Modified: scummvm/trunk/engines/sword2/sword2.cpp
===================================================================
--- scummvm/trunk/engines/sword2/sword2.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/sword2/sword2.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -491,9 +491,9 @@
 		KeyboardEvent *ke = keyboardEvent();
 
 		if (ke) {
-			if ((ke->kbd.flags == Common::KBD_CTRL && ke->kbd.keycode == Common::KEYCODE_d) || ke->kbd.ascii == '#' || ke->kbd.ascii == '~') {
+			if ((ke->kbd.hasFlags(Common::KBD_CTRL) && ke->kbd.keycode == Common::KEYCODE_d) || ke->kbd.ascii == '#' || ke->kbd.ascii == '~') {
 				_debugger->attach();
-			} else if (ke->kbd.flags == 0 || ke->kbd.flags == Common::KBD_SHIFT) {
+			} else if (ke->kbd.hasFlags(0) || ke->kbd.hasFlags(Common::KBD_SHIFT)) {
 				switch (ke->kbd.keycode) {
 				case Common::KEYCODE_p:
 					if (_gamePaused)
@@ -654,8 +654,8 @@
 	while (_eventMan->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_KEYDOWN:
-			if (event.kbd.flags == Common::KBD_CTRL) {
-				if (event.kbd.keycode == 'f') {
+			if (event.kbd.hasFlags(Common::KBD_CTRL)) {
+				if (event.kbd.keycode == Common::KEYCODE_f) {
 					if (_gameSpeed == 1)
 						_gameSpeed = 2;
 					else

Modified: scummvm/trunk/engines/teenagent/teenagent.cpp
===================================================================
--- scummvm/trunk/engines/teenagent/teenagent.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/teenagent/teenagent.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -474,12 +474,12 @@
 			//debug(0, "event");
 			switch (event.type) {
 			case Common::EVENT_KEYDOWN:
-				if ((event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 'd') ||
+				if ((event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_d) ||
 					event.kbd.ascii == '~' || event.kbd.ascii == '#') {
 					console->attach();
-				} else if (event.kbd.flags == 0 && event.kbd.keycode == Common::KEYCODE_F5) {
+				} else if (event.kbd.hasFlags(0) && event.kbd.keycode == Common::KEYCODE_F5) {
 					openMainMenuDialog();
-				} if (event.kbd.flags == Common::KBD_CTRL && event.kbd.keycode == 'f') {
+				} if (event.kbd.hasFlags(Common::KBD_CTRL) && event.kbd.keycode == Common::KEYCODE_f) {
 					_mark_delay = _mark_delay == 80? 40: 80;
 					debug(0, "mark_delay = %u", _mark_delay);
 				}

Modified: scummvm/trunk/engines/tinsel/tinsel.cpp
===================================================================
--- scummvm/trunk/engines/tinsel/tinsel.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/tinsel/tinsel.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -230,11 +230,11 @@
 			continue;
 		case Common::KEYCODE_m:
 			// Debug facility - scene hopper
-			if (TinselV2 && (evt.kbd.flags == Common::KBD_ALT))
+			if (TinselV2 && (evt.kbd.hasFlags(Common::KBD_ALT)))
 				ProcessKeyEvent(PLR_JUMP);
 			break;
 		case Common::KEYCODE_q:
-			if ((evt.kbd.flags == Common::KBD_CTRL) || (evt.kbd.flags == Common::KBD_ALT))
+			if ((evt.kbd.hasFlags(Common::KBD_CTRL)) || (evt.kbd.hasFlags(Common::KBD_ALT)))
 				ProcessKeyEvent(PLR_QUIT);
 			continue;
 		case Common::KEYCODE_PAGEUP:
@@ -1201,7 +1201,8 @@
 	// Handle any special keys immediately
 	switch (event.kbd.keycode) {
 	case Common::KEYCODE_d:
-		if ((event.kbd.flags == Common::KBD_CTRL) && (event.type == Common::EVENT_KEYDOWN)) {
+		// Checks for CTRL flag, ignoring all the sticky flags
+		if ((Common::KBD_CTRL == (event.kbd.flags & ~(Common::KBD_NUM|Common::KBD_CAPS|Common::KBD_SCRL))) && (event.type == Common::EVENT_KEYDOWN)) {
 			// Activate the debugger
 			assert(_console);
 			_console->attach();

Modified: scummvm/trunk/engines/touche/touche.cpp
===================================================================
--- scummvm/trunk/engines/touche/touche.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/touche/touche.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -313,7 +313,7 @@
 			} else if (event.kbd.keycode == Common::KEYCODE_F10) {
 				_fastWalkMode = false;
 			}
-			if (event.kbd.flags == Common::KBD_CTRL) {
+			if (event.kbd.hasFlags(Common::KBD_CTRL)) {
 				if (event.kbd.keycode == Common::KEYCODE_f) {
 					_fastMode = !_fastMode;
 				}

Modified: scummvm/trunk/engines/tucker/tucker.cpp
===================================================================
--- scummvm/trunk/engines/tucker/tucker.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/engines/tucker/tucker.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -607,7 +607,7 @@
 		case Common::EVENT_KEYDOWN:
 			switch (ev.kbd.keycode) {
 			case Common::KEYCODE_f:
-				if (ev.kbd.flags == Common::KBD_CTRL) {
+				if (ev.kbd.hasFlags(Common::KBD_CTRL)) {
 					_fastMode = !_fastMode;
 				}
 				break;

Modified: scummvm/trunk/gui/ListWidget.cpp
===================================================================
--- scummvm/trunk/gui/ListWidget.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/ListWidget.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -286,7 +286,7 @@
 	bool dirty = false;
 	int oldSelectedItem = _selectedItem;
 
-	if (!_editMode && isprint((unsigned char)state.ascii)) {
+	if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) {
 		// Quick selection mode: Go to first list item starting with this key
 		// (or a substring accumulated from the last couple key presses).
 		// Only works in a useful fashion if the list entries are sorted.
@@ -339,8 +339,18 @@
 					sendCommand(kListItemActivatedCmd, _selectedItem);
 			}
 			break;
+
+		// Keypad & special keys
+		//   - if num lock is set, we do not handle the keypress
+		//   - if num lock is not set, we either fall down to the special key case
+		//     or ignore the key press for 0, 4, 5 and 6
+
+		case Common::KEYCODE_KP_PERIOD:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
 		case Common::KEYCODE_BACKSPACE:
-		case Common::KEYCODE_KP_PERIOD:
 		case Common::KEYCODE_DELETE:
 			if (_selectedItem >= 0) {
 				if (_editable) {
@@ -350,30 +360,68 @@
 				}
 			}
 			break;
-		case Common::KEYCODE_UP:
-			if (_selectedItem > 0)
-				_selectedItem--;
+
+		case Common::KEYCODE_KP1:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
+		case Common::KEYCODE_END:
+			_selectedItem = _list.size() - 1;
 			break;
+
+
+		case Common::KEYCODE_KP2:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
 		case Common::KEYCODE_DOWN:
 			if (_selectedItem < (int)_list.size() - 1)
 				_selectedItem++;
 			break;
-		case Common::KEYCODE_PAGEUP:
-			_selectedItem -= _entriesPerPage - 1;
-			if (_selectedItem < 0)
-				_selectedItem = 0;
-			break;
+
+		case Common::KEYCODE_KP3:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
 		case Common::KEYCODE_PAGEDOWN:
 			_selectedItem += _entriesPerPage - 1;
 			if (_selectedItem >= (int)_list.size() )
 				_selectedItem = _list.size() - 1;
 			break;
+
+		case Common::KEYCODE_KP7:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
 		case Common::KEYCODE_HOME:
 			_selectedItem = 0;
 			break;
-		case Common::KEYCODE_END:
-			_selectedItem = _list.size() - 1;
+
+		case Common::KEYCODE_KP8:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
+		case Common::KEYCODE_UP:
+			if (_selectedItem > 0)
+				_selectedItem--;
 			break;
+
+		case Common::KEYCODE_KP9:
+			if (state.flags & Common::KBD_NUM) {
+				handled = false;
+				break;
+			}
+		case Common::KEYCODE_PAGEUP:
+			_selectedItem -= _entriesPerPage - 1;
+			if (_selectedItem < 0)
+				_selectedItem = 0;
+			break;
+
 		default:
 			handled = false;
 		}

Modified: scummvm/trunk/gui/PopUpWidget.cpp
===================================================================
--- scummvm/trunk/gui/PopUpWidget.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/PopUpWidget.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -222,23 +222,45 @@
 		return;
 
 	switch (state.keycode) {
+
 	case Common::KEYCODE_RETURN:
 	case Common::KEYCODE_KP_ENTER:
 		setResult(_selection);
 		close();
 		break;
-	case Common::KEYCODE_UP:
-		moveUp();
+
+	// Keypad & special keys
+	//   - if num lock is set, we ignore the keypress
+	//   - if num lock is not set, we fall down to the special key case
+
+	case Common::KEYCODE_KP1:
+		if (state.flags & Common::KBD_NUM)
+			break;
+	case Common::KEYCODE_END:
+		setSelection(_popUpBoss->_entries.size()-1);
 		break;
+
+	case Common::KEYCODE_KP2:
+		if (state.flags & Common::KBD_NUM)
+			break;
 	case Common::KEYCODE_DOWN:
 		moveDown();
 		break;
+
+	case Common::KEYCODE_KP7:
+		if (state.flags & Common::KBD_NUM)
+			break;
 	case Common::KEYCODE_HOME:
 		setSelection(0);
 		break;
-	case Common::KEYCODE_END:
-		setSelection(_popUpBoss->_entries.size()-1);
+
+	case Common::KEYCODE_KP8:
+		if (state.flags & Common::KBD_NUM)
+			break;
+	case Common::KEYCODE_UP:
+		moveUp();
 		break;
+
 	default:
 		break;
 	}

Modified: scummvm/trunk/gui/console.cpp
===================================================================
--- scummvm/trunk/gui/console.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/console.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -302,9 +302,11 @@
 			slideUpAndClose();
 		break;
 		}
+
 	case Common::KEYCODE_ESCAPE:
 		slideUpAndClose();
 		break;
+
 	case Common::KEYCODE_BACKSPACE:
 		if (_caretVisible)
 			drawCaret(true);
@@ -316,8 +318,8 @@
 		scrollToCurrent();
 		drawLine(pos2line(_currentPos));
 		break;
-	case Common::KEYCODE_TAB:
-	{
+
+	case Common::KEYCODE_TAB: {
 		if (_completionCallbackProc) {
 			int len = _currentPos - _promptStartPos;
 			assert(len >= 0);
@@ -339,24 +341,64 @@
 			delete[] str;
 		}
 		break;
-	}
+		}
+
+	// Keypad & special keys
+	//   - if num lock is set, we always go to the default case
+	//   - if num lock is not set, we either fall down to the special key case
+	//     or ignore the key press in case of 0 (INSERT) or 5
+
+	case Common::KEYCODE_KP0:
+	case Common::KEYCODE_KP5:
+		if (state.flags & Common::KBD_NUM)
+			defaultKeyDownHandler(state);
+		break;
+
+	case Common::KEYCODE_KP_PERIOD:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
 	case Common::KEYCODE_DELETE:
 		if (_currentPos < _promptEndPos) {
 			killChar();
 			drawLine(pos2line(_currentPos));
 		}
 		break;
-	case Common::KEYCODE_PAGEUP:
-		if (state.flags == Common::KBD_SHIFT) {
-			_scrollLine -= _linesPerPage - 1;
-			if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1)
-				_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
+
+	case Common::KEYCODE_KP1:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
+	case Common::KEYCODE_END:
+		if (state.hasFlags(Common::KBD_SHIFT)) {
+			_scrollLine = _promptEndPos / kCharsPerLine;
+			if (_scrollLine < _linesPerPage - 1)
+				_scrollLine = _linesPerPage - 1;
 			updateScrollBuffer();
-			draw();
+		} else {
+			_currentPos = _promptEndPos;
 		}
+		draw();
 		break;
+
+	case Common::KEYCODE_KP2:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
+	case Common::KEYCODE_DOWN:
+		historyScroll(-1);
+		break;
+
+	case Common::KEYCODE_KP3:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
 	case Common::KEYCODE_PAGEDOWN:
-		if (state.flags == Common::KBD_SHIFT) {
+		if (state.hasFlags(Common::KBD_SHIFT)) {
 			_scrollLine += _linesPerPage - 1;
 			if (_scrollLine > _promptEndPos / kCharsPerLine) {
 				_scrollLine = _promptEndPos / kCharsPerLine;
@@ -367,8 +409,36 @@
 			draw();
 		}
 		break;
+
+	case Common::KEYCODE_KP4:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
+	case Common::KEYCODE_LEFT:
+		if (_currentPos > _promptStartPos)
+			_currentPos--;
+		drawLine(pos2line(_currentPos));
+		break;
+
+	case Common::KEYCODE_KP6:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
+	case Common::KEYCODE_RIGHT:
+		if (_currentPos < _promptEndPos)
+			_currentPos++;
+		drawLine(pos2line(_currentPos));
+		break;
+
+	case Common::KEYCODE_KP7:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
 	case Common::KEYCODE_HOME:
-		if (state.flags == Common::KBD_SHIFT) {
+		if (state.hasFlags(Common::KBD_SHIFT)) {
 			_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
 			updateScrollBuffer();
 		} else {
@@ -376,48 +446,50 @@
 		}
 		draw();
 		break;
-	case Common::KEYCODE_END:
-		if (state.flags == Common::KBD_SHIFT) {
-			_scrollLine = _promptEndPos / kCharsPerLine;
-			if (_scrollLine < _linesPerPage - 1)
-				_scrollLine = _linesPerPage - 1;
-			updateScrollBuffer();
-		} else {
-			_currentPos = _promptEndPos;
+
+	case Common::KEYCODE_KP8:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
 		}
-		draw();
-		break;
 	case Common::KEYCODE_UP:
 		historyScroll(+1);
 		break;
-	case Common::KEYCODE_DOWN:
-		historyScroll(-1);
+
+	case Common::KEYCODE_KP9:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state);
+			break;
+		}
+	case Common::KEYCODE_PAGEUP:
+		if (state.hasFlags(Common::KBD_SHIFT)) {
+			_scrollLine -= _linesPerPage - 1;
+			if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1)
+				_scrollLine = _firstLineInBuffer + _linesPerPage - 1;
+			updateScrollBuffer();
+			draw();
+		}
 		break;
-	case Common::KEYCODE_RIGHT:
-		if (_currentPos < _promptEndPos)
-			_currentPos++;
-		drawLine(pos2line(_currentPos));
-		break;
-	case Common::KEYCODE_LEFT:
-		if (_currentPos > _promptStartPos)
-			_currentPos--;
-		drawLine(pos2line(_currentPos));
-		break;
+
 	default:
-		if (state.ascii == '~' || state.ascii == '#') {
-			slideUpAndClose();
-		} else if (state.flags == Common::KBD_CTRL) {
-			specialKeys(state.keycode);
-		} else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
-			for (i = _promptEndPos - 1; i >= _currentPos; i--)
-				buffer(i + 1) = buffer(i);
-			_promptEndPos++;
-			putchar((byte)state.ascii);
-			scrollToCurrent();
-		}
+		defaultKeyDownHandler(state);
 	}
 }
 
+void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) {
+	if (state.ascii == '~' || state.ascii == '#') {
+		slideUpAndClose();
+	} else if (state.hasFlags(Common::KBD_CTRL)) {
+		specialKeys(state.keycode);
+	} else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) {
+		for (int i = _promptEndPos - 1; i >= _currentPos; i--)
+			buffer(i + 1) = buffer(i);
+		_promptEndPos++;
+		putchar((byte)state.ascii);
+		scrollToCurrent();
+	}
+}
+
 void ConsoleDialog::insertIntoPrompt(const char* str) {
 	unsigned int l = strlen(str);
 	for (int i = _promptEndPos - 1; i >= _currentPos; i--)

Modified: scummvm/trunk/gui/console.h
===================================================================
--- scummvm/trunk/gui/console.h	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/console.h	2010-02-21 04:04:13 UTC (rev 48101)
@@ -178,6 +178,8 @@
 	void updateScrollBuffer();
 	void scrollToCurrent();
 
+	void defaultKeyDownHandler(Common::KeyState &state);
+
 	// Line editing
 	void specialKeys(int keycode);
 	void nextLine();

Modified: scummvm/trunk/gui/editable.cpp
===================================================================
--- scummvm/trunk/gui/editable.cpp	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/editable.cpp	2010-02-21 04:04:13 UTC (rev 48101)
@@ -100,10 +100,12 @@
 		endEditMode();
 		dirty = true;
 		break;
+
 	case Common::KEYCODE_ESCAPE:
 		abortEditMode();
 		dirty = true;
 		break;
+
 	case Common::KEYCODE_BACKSPACE:
 		if (_caretPos > 0) {
 			_caretPos--;
@@ -114,6 +116,28 @@
 		}
 		forcecaret = true;
 		break;
+
+	// Keypad & special keys
+	//   - if num lock is set, we always go to the default case
+	//   - if num lock is not set, we either fall down to the special key case
+	//     or ignore the key press in case of 0 (INSERT), 2 (DOWN), 3 (PGDWN)
+	//     5, 8 (UP) and 9 (PGUP)
+
+	case Common::KEYCODE_KP0:
+	case Common::KEYCODE_KP2:
+	case Common::KEYCODE_KP3:
+	case Common::KEYCODE_KP5:
+	case Common::KEYCODE_KP8:
+	case Common::KEYCODE_KP9:
+		if (state.flags & Common::KBD_NUM)
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+		break;
+
+	case Common::KEYCODE_KP_PERIOD:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+			break;
+		}
 	case Common::KEYCODE_DELETE:
 		if (_caretPos < (int)_editString.size()) {
 			_editString.deleteChar(_caretPos);
@@ -123,6 +147,22 @@
 		}
 		forcecaret = true;
 		break;
+
+	case Common::KEYCODE_KP1:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+			break;
+		}
+	case Common::KEYCODE_END:
+		dirty = setCaretPos(_editString.size());
+		forcecaret = true;
+		break;
+
+	case Common::KEYCODE_KP4:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+			break;
+		}
 	case Common::KEYCODE_LEFT:
 		if (_caretPos > 0) {
 			dirty = setCaretPos(_caretPos - 1);
@@ -130,6 +170,12 @@
 		forcecaret = true;
 		dirty = true;
 		break;
+
+	case Common::KEYCODE_KP6:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+			break;
+		}
 	case Common::KEYCODE_RIGHT:
 		if (_caretPos < (int)_editString.size()) {
 			dirty = setCaretPos(_caretPos + 1);
@@ -137,24 +183,19 @@
 		forcecaret = true;
 		dirty = true;
 		break;
+
+	case Common::KEYCODE_KP7:
+		if (state.flags & Common::KBD_NUM) {
+			defaultKeyDownHandler(state, dirty, forcecaret, handled);
+			break;
+		}
 	case Common::KEYCODE_HOME:
 		dirty = setCaretPos(0);
 		forcecaret = true;
 		break;
-	case Common::KEYCODE_END:
-		dirty = setCaretPos(_editString.size());
-		forcecaret = true;
-		break;
+
 	default:
-		if (tryInsertChar((byte)state.ascii, _caretPos)) {
-			_caretPos++;
-			dirty = true;
-			forcecaret = true;
-
-			sendCommand(_cmd, 0);
-		} else {
-			handled = false;
-		}
+		defaultKeyDownHandler(state, dirty, forcecaret, handled);
 	}
 
 	if (dirty)
@@ -166,6 +207,18 @@
 	return handled;
 }
 
+void EditableWidget::defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled) {
+	if (tryInsertChar((byte)state.ascii, _caretPos)) {
+		_caretPos++;
+		dirty = true;
+		forcecaret = true;
+
+		sendCommand(_cmd, 0);
+	} else {
+		handled = false;
+	}
+}
+
 int EditableWidget::getCaretOffset() const {
 	int caretpos = 0;
 	for (int i = 0; i < _caretPos; i++)

Modified: scummvm/trunk/gui/editable.h
===================================================================
--- scummvm/trunk/gui/editable.h	2010-02-21 01:25:10 UTC (rev 48100)
+++ scummvm/trunk/gui/editable.h	2010-02-21 04:04:13 UTC (rev 48101)
@@ -81,6 +81,8 @@
 	bool adjustOffset();
 	void makeCaretVisible();
 
+	void defaultKeyDownHandler(Common::KeyState &state, bool &dirty, bool &forcecaret, bool &handled);
+
 	void setFontStyle(ThemeEngine::FontStyle font) { _font = font; }
 
 	virtual bool tryInsertChar(byte c, int pos);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list