[Scummvm-cvs-logs] CVS: residual driver.h,1.19,1.20 driver_sdl.cpp,1.2,1.3 driver_sdl.h,1.2,1.3 engine.cpp,1.102,1.103 engine.h,1.41,1.42 lua.cpp,1.167,1.168

Marcus Comstedt marcus_c at users.sourceforge.net
Sun Feb 5 12:41:09 CET 2006


Update of /cvsroot/scummvm/residual
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12232

Modified Files:
	driver.h driver_sdl.cpp driver_sdl.h engine.cpp engine.h 
	lua.cpp 
Log Message:
Event handling abstracted through Driver interface.

Index: driver.h
===================================================================
RCS file: /cvsroot/scummvm/residual/driver.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- driver.h	5 Feb 2006 17:48:19 -0000	1.19
+++ driver.h	5 Feb 2006 20:40:16 -0000	1.20
@@ -108,6 +108,103 @@
 
 	typedef int (*TimerProc)(int interval);
 
+	/**
+	 * The types of events backends may generate.
+	 * @see Event
+	 */
+	enum EventType {
+		/** A key was pressed, details in Event::kbd. */
+		EVENT_KEYDOWN = 1,
+		/** A key was released, details in Event::kbd. */
+		EVENT_KEYUP = 2,
+
+		EVENT_QUIT = 10,
+		EVENT_REFRESH = 11
+	};
+
+	/**
+	 * Keyboard modifier flags, used for Event::kbd::flags.
+	 */
+	enum {
+		KBD_CTRL  = 1 << 0,
+		KBD_ALT   = 1 << 1,
+		KBD_SHIFT = 1 << 2
+	};
+
+	/**
+	 * Data structure for an event. A pointer to an instance of Event
+	 * can be passed to pollEvent.
+	 */
+	struct Event {
+		/** The type of the event. */
+		EventType type;
+		/**
+		  * Keyboard data; only valid for keyboard events (EVENT_KEYDOWN and
+		  * EVENT_KEYUP). For all other event types, content is undefined.
+		  */
+		struct {
+			/**
+			 * Abstract control number (will be the same for any given key regardless
+			 * of modifiers being held at the same time.
+			 * For example, this is the same for both 'A' and Shift-'A'.
+			 */
+			int num;
+			/**
+			 * ASCII-value of the pressed key (if any).
+			 * This depends on modifiers, i.e. pressing the 'A' key results in
+			 * different values here depending on the status of shift, alt and
+			 * caps lock.
+			 */
+			uint16 ascii;
+			/**
+			 * Status of the modifier keys. Bits are set in this for each
+			 * pressed modifier
+			 * @see KBD_CTRL, KBD_ALT, KBD_SHIFT
+			 */
+			byte flags;
+		} kbd;
+	};
+
+	/**
+	 *
+	 */
+	struct ControlDescriptor {
+		char *name;
+		int key;
+	};
+
+	/**
+	 * Get a list of all named controls supported by the driver
+	 */
+	virtual const ControlDescriptor *listControls() = 0;
+
+	/**
+	 * Get the largest control number used by the driver, plus 1
+	 */
+	virtual int getNumControls() = 0;
+
+	/**
+	 * Check whether a control is an axis control
+	 */
+	virtual bool controlIsAxis(int num) = 0;
+
+	/**
+	 * Read the current value of an axis control
+	 */
+	virtual int getControlAxis(int num) = 0;
+
+	/**
+	 * Read the current state of a non-axis control
+	 */
+	virtual bool getControlState(int num) = 0;
+
+	/**
+	 * Get the next event in the event queue.
+	 * @param event	point to an Event struct, which will be filled with the event data.
+	 * @return true if an event was retrieved.
+	 */
+	virtual bool pollEvent(Event &event) = 0;
+
 	/** Get the number of milliseconds since the program was started. */
 	virtual uint32 getMillis() = 0;
 

Index: driver_sdl.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_sdl.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver_sdl.cpp	5 Feb 2006 17:48:19 -0000	1.2
+++ driver_sdl.cpp	5 Feb 2006 20:40:16 -0000	1.3
@@ -21,6 +21,325 @@
 // NOTE: This is not a complete driver, it needs to be subclassed
 //       to provide rendering functionality.
 
+
+// Fake SDLK_* values for joystick and mouse events
+enum {
+	SDLK_JOY1_B1 = SDLK_LAST,
+	SDLK_JOY1_B2,
+	SDLK_JOY1_B3,
+	SDLK_JOY1_B4,
+	SDLK_JOY1_B5,
+	SDLK_JOY1_B6,
+	SDLK_JOY1_B7,
+	SDLK_JOY1_B8,
+	SDLK_JOY1_B9,
+	SDLK_JOY1_B10,
+	SDLK_JOY1_HLEFT,
+	SDLK_JOY1_HUP,
+	SDLK_JOY1_HRIGHT,
+	SDLK_JOY1_HDOWN,
+	SDLK_JOY2_B1,
+	SDLK_JOY2_B2,
+	SDLK_JOY2_B3,
+	SDLK_JOY2_B4,
+	SDLK_JOY2_B5,
+	SDLK_JOY2_B6,
+	SDLK_JOY2_B7,
+	SDLK_JOY2_B8,
+	SDLK_JOY2_B9,
+	SDLK_JOY2_B10,
+	SDLK_JOY2_HLEFT,
+	SDLK_JOY2_HUP,
+	SDLK_JOY2_HRIGHT,
+	SDLK_JOY2_HDOWN,
+	SDLK_MOUSE_B1,
+	SDLK_MOUSE_B2,
+	SDLK_MOUSE_B3,
+	SDLK_MOUSE_B4,
+	SDLK_AXIS_JOY1_X,
+	SDLK_AXIS_JOY1_Y,
+	SDLK_AXIS_JOY1_Z,
+	SDLK_AXIS_JOY1_R,
+	SDLK_AXIS_JOY1_U,
+	SDLK_AXIS_JOY1_V,
+	SDLK_AXIS_JOY2_X,
+	SDLK_AXIS_JOY2_Y,
+	SDLK_AXIS_JOY2_Z,
+	SDLK_AXIS_JOY2_R,
+	SDLK_AXIS_JOY2_U,
+	SDLK_AXIS_JOY2_V,
+	SDLK_AXIS_MOUSE_X,
+	SDLK_AXIS_MOUSE_Y,
+	SDLK_AXIS_MOUSE_Z,
+	SDLK_EXTRA_LAST
+};
+
+// Entries in the system.controls table
+
+static const Driver::ControlDescriptor controls[] = {
+	{ "KEY_ESCAPE", SDLK_ESCAPE },
+	{ "KEY_1", SDLK_1 },
+	{ "KEY_2", SDLK_2 },
+	{ "KEY_3", SDLK_3 },
+	{ "KEY_4", SDLK_4 },
+	{ "KEY_5", SDLK_5 },
+	{ "KEY_6", SDLK_6 },
+	{ "KEY_7", SDLK_7 },
+	{ "KEY_8", SDLK_8 },
+	{ "KEY_9", SDLK_9 },
+	{ "KEY_0", SDLK_0 },
+	{ "KEY_MINUS", SDLK_MINUS },
+	{ "KEY_EQUALS", SDLK_EQUALS },
+	{ "KEY_BACK", SDLK_BACKSPACE },
+	{ "KEY_TAB", SDLK_TAB },
+	{ "KEY_Q", SDLK_q },
+	{ "KEY_W", SDLK_w },
+	{ "KEY_E", SDLK_e },
+	{ "KEY_R", SDLK_r },
+	{ "KEY_T", SDLK_t },
+	{ "KEY_Y", SDLK_y },
+	{ "KEY_U", SDLK_u },
+	{ "KEY_I", SDLK_i },
+	{ "KEY_O", SDLK_o },
+	{ "KEY_P", SDLK_p },
+	{ "KEY_LBRACKET", SDLK_LEFTBRACKET },
+	{ "KEY_RBRACKET", SDLK_RIGHTBRACKET },
+	{ "KEY_RETURN", SDLK_RETURN },
+	{ "KEY_LCONTROL", SDLK_LCTRL },
+	{ "KEY_A", SDLK_a },
+	{ "KEY_S", SDLK_s },
+	{ "KEY_D", SDLK_d },
+	{ "KEY_F", SDLK_f },
+	{ "KEY_G", SDLK_g },
+	{ "KEY_H", SDLK_h },
+	{ "KEY_J", SDLK_j },
+	{ "KEY_K", SDLK_k },
+	{ "KEY_L", SDLK_l },
+	{ "KEY_SEMICOLON", SDLK_SEMICOLON },
+	{ "KEY_APOSTROPHE", SDLK_QUOTE },
+	{ "KEY_GRAVE", SDLK_BACKQUOTE },
+	{ "KEY_LSHIFT", SDLK_LSHIFT },
+	{ "KEY_BACKSLASH", SDLK_BACKSLASH },
+	{ "KEY_Z", SDLK_z },
+	{ "KEY_X", SDLK_x },
+	{ "KEY_C", SDLK_c },
+	{ "KEY_V", SDLK_v },
+	{ "KEY_B", SDLK_b },
+	{ "KEY_N", SDLK_n },
+	{ "KEY_M", SDLK_m },
+	{ "KEY_COMMA", SDLK_COMMA },
+	{ "KEY_PERIOD", SDLK_PERIOD },
+	{ "KEY_SLASH", SDLK_SLASH },
+	{ "KEY_RSHIFT", SDLK_RSHIFT },
+	{ "KEY_MULTIPLY", SDLK_KP_MULTIPLY },
+	{ "KEY_LMENU", SDLK_LALT },
+	{ "KEY_SPACE", SDLK_SPACE },
+	{ "KEY_CAPITAL", SDLK_CAPSLOCK },
+	{ "KEY_F1", SDLK_F1 },
+	{ "KEY_F2", SDLK_F2 },
+	{ "KEY_F3", SDLK_F3 },
+	{ "KEY_F4", SDLK_F4 },
+	{ "KEY_F5", SDLK_F5 },
+	{ "KEY_F6", SDLK_F6 },
+	{ "KEY_F7", SDLK_F7 },
+	{ "KEY_F8", SDLK_F8 },
+	{ "KEY_F9", SDLK_F9 },
+	{ "KEY_F10", SDLK_F10 },
+	{ "KEY_NUMLOCK", SDLK_NUMLOCK },
+	{ "KEY_SCROLL", SDLK_SCROLLOCK },
+	{ "KEY_NUMPAD7", SDLK_KP7 },
+	{ "KEY_NUMPAD8", SDLK_KP8 },
+	{ "KEY_NUMPAD9", SDLK_KP9 },
+	{ "KEY_SUBTRACT", SDLK_KP_MINUS },
+	{ "KEY_NUMPAD4", SDLK_KP4 },
+	{ "KEY_NUMPAD5", SDLK_KP5 },
+	{ "KEY_NUMPAD6", SDLK_KP6 },
+	{ "KEY_ADD", SDLK_KP_PLUS },
+	{ "KEY_NUMPAD1", SDLK_KP1 },
+	{ "KEY_NUMPAD2", SDLK_KP2 },
+	{ "KEY_NUMPAD3", SDLK_KP3 },
+	{ "KEY_NUMPAD0", SDLK_KP0 },
+	{ "KEY_DECIMAL", SDLK_KP_PERIOD },
+	{ "KEY_F11", SDLK_F11 },
+	{ "KEY_F12", SDLK_F12 },
+	{ "KEY_F13", SDLK_F13 },
+	{ "KEY_F14", SDLK_F14 },
+	{ "KEY_F15", SDLK_F15 },
+	{ "KEY_STOP", SDLK_BREAK },
+	{ "KEY_NUMPADENTER", SDLK_KP_ENTER },
+	{ "KEY_RCONTROL", SDLK_RCTRL },
+	{ "KEY_DIVIDE", SDLK_KP_DIVIDE },
+	{ "KEY_SYSRQ", SDLK_SYSREQ },
+	{ "KEY_RMENU", SDLK_RALT },
+	{ "KEY_HOME", SDLK_HOME },
+	{ "KEY_UP", SDLK_UP },
+	{ "KEY_PRIOR", SDLK_PAGEUP },
+	{ "KEY_LEFT", SDLK_LEFT },
+	{ "KEY_RIGHT", SDLK_RIGHT },
+	{ "KEY_END", SDLK_END },
+	{ "KEY_DOWN", SDLK_DOWN },
+	{ "KEY_NEXT", SDLK_PAGEDOWN },
+	{ "KEY_INSERT", SDLK_INSERT },
+	{ "KEY_DELETE", SDLK_DELETE },
+	{ "KEY_LWIN", SDLK_LSUPER },
+	{ "KEY_RWIN", SDLK_RSUPER },
+	{ "KEY_APPS", SDLK_MENU },
+	{ "KEY_JOY1_B1", SDLK_JOY1_B1 },
+	{ "KEY_JOY1_B2", SDLK_JOY1_B2 },
+	{ "KEY_JOY1_B3", SDLK_JOY1_B3 },
+	{ "KEY_JOY1_B4", SDLK_JOY1_B4 },
+	{ "KEY_JOY1_B5", SDLK_JOY1_B5 },
+	{ "KEY_JOY1_B6", SDLK_JOY1_B6 },
+	{ "KEY_JOY1_B7", SDLK_JOY1_B7 },
+	{ "KEY_JOY1_B8", SDLK_JOY1_B8 },
+	{ "KEY_JOY1_B9", SDLK_JOY1_B9 },
+	{ "KEY_JOY1_B10", SDLK_JOY1_B10 },
+	{ "KEY_JOY1_HLEFT", SDLK_JOY1_HLEFT },
+	{ "KEY_JOY1_HUP", SDLK_JOY1_HUP },
+	{ "KEY_JOY1_HRIGHT", SDLK_JOY1_HRIGHT },
+	{ "KEY_JOY1_HDOWN", SDLK_JOY1_HDOWN },
+	{ "KEY_JOY2_B1", SDLK_JOY2_B1 },
+	{ "KEY_JOY2_B2", SDLK_JOY2_B2 },
+	{ "KEY_JOY2_B3", SDLK_JOY2_B3 },
+	{ "KEY_JOY2_B4", SDLK_JOY2_B4 },
+	{ "KEY_JOY2_B5", SDLK_JOY2_B5 },
+	{ "KEY_JOY2_B6", SDLK_JOY2_B6 },
+	{ "KEY_JOY2_B7", SDLK_JOY2_B7 },
+	{ "KEY_JOY2_B8", SDLK_JOY2_B8 },
+	{ "KEY_JOY2_B9", SDLK_JOY2_B9 },
+	{ "KEY_JOY2_B10", SDLK_JOY2_B10 },
+	{ "KEY_JOY2_HLEFT", SDLK_JOY2_HLEFT },
+	{ "KEY_JOY2_HUP", SDLK_JOY2_HUP },
+	{ "KEY_JOY2_HRIGHT", SDLK_JOY2_HRIGHT },
+	{ "KEY_JOY2_HDOWN", SDLK_JOY2_HDOWN },
+	{ "KEY_MOUSE_B1", SDLK_MOUSE_B1 },
+	{ "KEY_MOUSE_B2", SDLK_MOUSE_B2 },
+	{ "KEY_MOUSE_B3", SDLK_MOUSE_B3 },
+	{ "KEY_MOUSE_B4", SDLK_MOUSE_B4 },
+	{ "AXIS_JOY1_X", SDLK_AXIS_JOY1_X },
+	{ "AXIS_JOY1_Y", SDLK_AXIS_JOY1_Y },
+	{ "AXIS_JOY1_Z", SDLK_AXIS_JOY1_Z },
+	{ "AXIS_JOY1_R", SDLK_AXIS_JOY1_R },
+	{ "AXIS_JOY1_U", SDLK_AXIS_JOY1_U },
+	{ "AXIS_JOY1_V", SDLK_AXIS_JOY1_V },
+	{ "AXIS_JOY2_X", SDLK_AXIS_JOY2_X },
+	{ "AXIS_JOY2_Y", SDLK_AXIS_JOY2_Y },
+	{ "AXIS_JOY2_Z", SDLK_AXIS_JOY2_Z },
+	{ "AXIS_JOY2_R", SDLK_AXIS_JOY2_R },
+	{ "AXIS_JOY2_U", SDLK_AXIS_JOY2_U },
+	{ "AXIS_JOY2_V", SDLK_AXIS_JOY2_V },
+	{ "AXIS_MOUSE_X", SDLK_AXIS_MOUSE_X },
+	{ "AXIS_MOUSE_Y", SDLK_AXIS_MOUSE_Y },
+	{ "AXIS_MOUSE_Z", SDLK_AXIS_MOUSE_Z },
+	{ NULL, 0 }
+};
+
+// numupper provides conversion between number keys and their "upper case"
+const char numupper[] = {')', '!', '@', '#', '$', '%', '^', '&', '*', '('};
+
+static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode)
+{
+	if (key >= SDLK_KP0 && key <= SDLK_KP9) {
+		return key - SDLK_KP0 + '0';
+	} else if (unicode) {
+		return unicode;
+	} else if (key >= 'a' && key <= 'z' && mod & KMOD_SHIFT) {
+		return key & ~0x20;
+	} else if (key >= SDLK_0 && key <= SDLK_9 && mod & KMOD_SHIFT) {
+		return numupper[key - SDLK_0];
+	} else if (key > 127) {
+		return 0;
+	}
+	return key;
+}
+
+static byte SDLModToDriverKeyFlags(SDLMod mod) {
+	byte b = 0;
+	if (mod & KMOD_SHIFT)
+		b |= Driver::KBD_SHIFT;
+	if (mod & KMOD_ALT)
+		b |= Driver::KBD_ALT;
+	if (mod & KMOD_CTRL)
+		b |= Driver::KBD_CTRL;
+
+	return b;
+}
+
+const Driver::ControlDescriptor *DriverSDL::listControls() {
+	return controls;
+}
+
+int DriverSDL::getNumControls() {
+	return SDLK_EXTRA_LAST;
+}
+
+bool DriverSDL::controlIsAxis(int num) {
+	return num >= SDLK_AXIS_JOY1_X && num <= SDLK_AXIS_MOUSE_Z;
+}
+
+int DriverSDL::getControlAxis(int num) {
+	return 0;
+}
+
+bool DriverSDL::getControlState(int num) {
+	if (num >= SDLK_JOY1_B1 && num <= SDLK_MOUSE_B4)
+		return false;
+	else {
+		uint8 *keystate = SDL_GetKeyState(NULL);
+		return keystate[num] != 0;
+	}
+}
+
+bool DriverSDL::pollEvent(Event &event) {
+	SDL_Event ev;
+	byte b = 0;
+
+	while(SDL_PollEvent(&ev)) {
+
+		if ((ev.key.keysym.sym == SDLK_RETURN ||
+		     ev.key.keysym.sym == SDLK_KP_ENTER) &&
+		    (ev.key.keysym.mod & KMOD_ALT)) {
+			toggleFullscreenMode();
+		}
+
+		switch(ev.type) {
+		case SDL_KEYDOWN:{
+			event.kbd.flags = SDLModToDriverKeyFlags(SDL_GetModState());
+
+			// Alt-Return and Alt-Enter toggle full screen mode
+			if (b == KBD_ALT && (ev.key.keysym.sym == SDLK_RETURN
+			                  || ev.key.keysym.sym == SDLK_KP_ENTER)) {
+				toggleFullscreenMode();
+				break;
+			}
+
+			event.type = EVENT_KEYDOWN;
+			event.kbd.num = ev.key.keysym.sym;
+			event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+
+			return true;
+		}
+		case SDL_KEYUP: {
+
+			event.type = EVENT_KEYUP;
+			event.kbd.num = ev.key.keysym.sym;
+			event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+			b = event.kbd.flags = SDLModToDriverKeyFlags(SDL_GetModState());
+
+			return true;
+		}
+		case SDL_VIDEOEXPOSE:
+			event.type = EVENT_REFRESH;
+			return true;
+
+		case SDL_QUIT:
+			event.type = EVENT_QUIT;
+			return true;
+		}
+	}
+	return false;
+}
+
 uint32 DriverSDL::getMillis() {
 	return SDL_GetTicks();
 }

Index: driver_sdl.h
===================================================================
RCS file: /cvsroot/scummvm/residual/driver_sdl.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- driver_sdl.h	5 Feb 2006 17:48:19 -0000	1.2
+++ driver_sdl.h	5 Feb 2006 20:40:16 -0000	1.3
@@ -36,6 +36,12 @@
 	DriverSDL() : _samplesPerSec(22050) { ; }
 	virtual ~DriverSDL() { ; }
 
+	const ControlDescriptor *listControls();
+	int getNumControls();
+	bool controlIsAxis(int num);
+	int getControlAxis(int num);
+	bool getControlState(int num);
+	bool pollEvent(Event &event);
 	uint32 getMillis();
 	void delayMillis(uint msecs);
 	void setTimerCallback(TimerProc callback, int interval);

Index: engine.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/engine.cpp,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -d -r1.102 -r1.103
--- engine.cpp	5 Feb 2006 17:19:44 -0000	1.102
+++ engine.cpp	5 Feb 2006 20:40:16 -0000	1.103
@@ -28,14 +28,11 @@
 
 #include "imuse/imuse.h"
 
-#include <SDL.h>
 #include <assert.h>
 
 // CHAR_KEY tests to see whether a keycode is for
 // a "character" handler or a "button" handler
-#define CHAR_KEY(k) (k >= SDLK_a && k <= SDLK_z) || (k >= SDLK_0 && k <= SDLK_9) || k == SDLK_SPACE
-// numupper provides conversion between number keys and their "upper case"
-const char numupper[] = {')', '!', '@', '#', '$', '%', '^', '&', '*', '('};
+#define CHAR_KEY(k) (k >= 'a' && k <= 'z') || (k >= 'A' && k <= 'Z') || (k >= '0' && k <= '9') || k == ' '
 
 Engine *g_engine = NULL;
 
@@ -61,7 +58,10 @@
 
 Engine::Engine() :
 		_currScene(NULL), _selectedActor(NULL) {
-	for (int i = 0; i < SDLK_EXTRA_LAST; i++)
+
+	int lastKey = g_driver->getNumControls();
+	_controlsEnabled = new bool[lastKey];
+	for (int i = 0; i < lastKey; i++)
 		_controlsEnabled[i] = false;
 	_speechMode = 3; // VOICE + TEXT
 	_textSpeed = 6;
@@ -103,7 +103,12 @@
 	printLineDefaults.justify = 2;
 }
 
-void Engine::handleButton(int operation, int key, int keyModifier) {
+Engine::~Engine()
+{
+	delete[] _controlsEnabled;
+}
+
+void Engine::handleButton(int operation, int key, int keyModifier, uint16 ascii) {
 	lua_Object handler, system_table, userPaintHandler;
 	
 	// If we're not supposed to handle the key then don't
@@ -113,23 +118,17 @@
 	lua_beginblock();
 	system_table = lua_getglobal("system");
 	userPaintHandler = getTableValue(system_table, "userPaintHandler");
-	if (userPaintHandler != LUA_NOOBJECT && CHAR_KEY(key)) {
+	if (userPaintHandler != LUA_NOOBJECT && CHAR_KEY(ascii)) {
 		handler = getTableFunction(userPaintHandler, "characterHandler");
-		// Ignore SDL_KEYUP so there are not duplicate keystrokes, but
+		// Ignore EVENT_KEYUP so there are not duplicate keystrokes, but
 		// don't pass on to the normal buttonHandler since it doesn't
 		// recognize character codes
-		if (handler != LUA_NOOBJECT && operation == SDL_KEYDOWN) {
+		if (handler != LUA_NOOBJECT && operation == Driver::EVENT_KEYDOWN) {
 			char keychar[2];
 			
 			lua_beginblock();
 			lua_pushobject(userPaintHandler);
-			if (keyModifier & KMOD_SHIFT)
-				if (isalpha(key))
-					keychar[0] = toupper(key);
-				else
-					keychar[0] = numupper[key - SDLK_0];
-			else
-				keychar[0] = key;
+			keychar[0] = ascii;
 			keychar[1] = '\0';
 			lua_pushstring(keychar);
 			lua_pushnil();
@@ -139,7 +138,7 @@
 	} else {
 		// Only allow the "Q" safe-exit when in-game, otherwise
 		// it interferes with menu operation
-		if (key == SDLK_q) {
+		if (ascii == 'q') {
 			lua_beginblock();
 			lua_Object handler = getEventHandler("exitHandler");
 			if (handler != LUA_NOOBJECT)
@@ -149,7 +148,7 @@
 			handler = getEventHandler("buttonHandler");
 			if (handler != LUA_NOOBJECT) {
 				lua_pushnumber(key);
-				if (operation == SDL_KEYDOWN)
+				if (operation == Driver::EVENT_KEYDOWN)
 					lua_pushnumber(1);
 				else
 					lua_pushnil();
@@ -413,26 +412,21 @@
 			continue;
 
 		// Process events
-		SDL_Event event;
-		while (SDL_PollEvent(&event)) {
+		Driver::Event event;
+		while (g_driver->pollEvent(event)) {
 			// Handle any button operations
-			if (event.type == SDL_KEYDOWN || event.type == SDL_KEYUP)
-				handleButton(event.type, event.key.keysym.sym, event.key.keysym.mod);
+			if (event.type == Driver::EVENT_KEYDOWN || event.type == Driver::EVENT_KEYUP)
+				handleButton(event.type, event.kbd.num, event.kbd.flags, event.kbd.ascii);
 			// Check for "Hard" quit"
-			if (event.type == SDL_QUIT)
+			if (event.type == Driver::EVENT_QUIT)
 				return;
-			if (event.type == SDL_VIDEOEXPOSE)
+			if (event.type == Driver::EVENT_REFRESH)
 				_refreshDrawNeeded = true;
-			if (event.type == SDL_KEYDOWN) {
-				if (event.key.keysym.sym == SDLK_z
-						&& (event.key.keysym.mod & KMOD_CTRL)) {
+			if (event.type == Driver::EVENT_KEYDOWN) {
+				if (event.kbd.ascii == 'z'
+						&& (event.kbd.flags & Driver::KBD_CTRL)) {
 					handleDebugLoadResource();
 				}
-				if ((event.key.keysym.sym == SDLK_RETURN ||
-						event.key.keysym.sym == SDLK_KP_ENTER) &&
-						(event.key.keysym.mod & KMOD_ALT)) {
-					g_driver->toggleFullscreenMode();
-				}
 			}
 		}
 

Index: engine.h
===================================================================
RCS file: /cvsroot/scummvm/residual/engine.h,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- engine.h	21 Jan 2006 17:22:39 -0000	1.41
+++ engine.h	5 Feb 2006 20:40:16 -0000	1.42
@@ -27,7 +27,6 @@
 
 #include <cstdlib>
 #include <list>
-#include <SDL_keysym.h>
 
 class Actor;
 
@@ -41,58 +40,6 @@
 
 #define GF_DEMO		1
 
-// Fake SDLK_* values for joystick and mouse events
-enum {
-	SDLK_JOY1_B1 = SDLK_LAST,
-	SDLK_JOY1_B2,
-	SDLK_JOY1_B3,
-	SDLK_JOY1_B4,
-	SDLK_JOY1_B5,
-	SDLK_JOY1_B6,
-	SDLK_JOY1_B7,
-	SDLK_JOY1_B8,
-	SDLK_JOY1_B9,
-	SDLK_JOY1_B10,
-	SDLK_JOY1_HLEFT,
-	SDLK_JOY1_HUP,
-	SDLK_JOY1_HRIGHT,
-	SDLK_JOY1_HDOWN,
-	SDLK_JOY2_B1,
-	SDLK_JOY2_B2,
-	SDLK_JOY2_B3,
-	SDLK_JOY2_B4,
-	SDLK_JOY2_B5,
-	SDLK_JOY2_B6,
-	SDLK_JOY2_B7,
-	SDLK_JOY2_B8,
-	SDLK_JOY2_B9,
-	SDLK_JOY2_B10,
-	SDLK_JOY2_HLEFT,
-	SDLK_JOY2_HUP,
-	SDLK_JOY2_HRIGHT,
-	SDLK_JOY2_HDOWN,
-	SDLK_MOUSE_B1,
-	SDLK_MOUSE_B2,
-	SDLK_MOUSE_B3,
-	SDLK_MOUSE_B4,
-	SDLK_AXIS_JOY1_X,
-	SDLK_AXIS_JOY1_Y,
-	SDLK_AXIS_JOY1_Z,
-	SDLK_AXIS_JOY1_R,
-	SDLK_AXIS_JOY1_U,
-	SDLK_AXIS_JOY1_V,
-	SDLK_AXIS_JOY2_X,
-	SDLK_AXIS_JOY2_Y,
-	SDLK_AXIS_JOY2_Z,
-	SDLK_AXIS_JOY2_R,
-	SDLK_AXIS_JOY2_U,
-	SDLK_AXIS_JOY2_V,
-	SDLK_AXIS_MOUSE_X,
-	SDLK_AXIS_MOUSE_Y,
-	SDLK_AXIS_MOUSE_Z,
-	SDLK_EXTRA_LAST
-};
-
 class Engine {
 public:
 
@@ -209,11 +156,11 @@
 	SaveGame *_savedState;
 
 	Engine();
-	~Engine() {}
+	~Engine();
 
 private:
 
-	void handleButton(int operation, int key, int keyModifier);
+	void handleButton(int operation, int key, int keyModifier, uint16 ascii);
 
 	Scene *_currScene;
 	int _mode, _previousMode;
@@ -231,7 +178,7 @@
 	unsigned int _frameCounter;
 	unsigned int _timeAccum;
 
-	bool _controlsEnabled[SDLK_EXTRA_LAST];
+	bool *_controlsEnabled;
 
 	SceneListType _scenes;
 	ActorListType _actors;

Index: lua.cpp
===================================================================
RCS file: /cvsroot/scummvm/residual/lua.cpp,v
retrieving revision 1.167
retrieving revision 1.168
diff -u -d -r1.167 -r1.168
--- lua.cpp	5 Feb 2006 16:11:11 -0000	1.167
+++ lua.cpp	5 Feb 2006 20:40:16 -0000	1.168
@@ -37,9 +37,7 @@
 
 #include <cstdio>
 #include <cmath>
-#include <SDL_keysym.h>
-#include <SDL_keyboard.h>
-#include <SDL_events.h>
+#include <SDL.h>
 #include <zlib.h>
 
 extern Imuse *g_imuse;
@@ -165,7 +163,7 @@
 
 static inline int check_control(int num) {
 	int val = check_int(num);
-	if (val < 0 || val >= SDLK_EXTRA_LAST)
+	if (val < 0 || val >= g_driver->getNumControls())
 		luaL_argerror(num, "control identifier out of range");
 	return val;
 }
@@ -2164,14 +2162,10 @@
 	
 	DEBUG_FUNCTION();
 	num = check_control(1);
-	if (num >= SDLK_JOY1_B1 && num <= SDLK_MOUSE_B4)
-		lua_pushnil();
-	else if (num >= SDLK_AXIS_JOY1_X && num <= SDLK_AXIS_MOUSE_Z)
-		lua_pushnumber(0);
-	else {
-		uint8 *keystate = SDL_GetKeyState(NULL);
-		pushbool(keystate[num] != 0);
-	}
+	if (g_driver->controlIsAxis(num))
+		lua_pushnumber(g_driver->getControlAxis(num));
+	else
+		pushbool(g_driver->getControlState(num));
 }
 
 static void GetImage() {
@@ -3327,168 +3321,6 @@
 	{ "movieTime", 0 }
 };
 
-// Entries in the system.controls table
-
-static struct {
-	char *name;
-	int key;
-} controls[] = {
-	{ "KEY_ESCAPE", SDLK_ESCAPE },
-	{ "KEY_1", SDLK_1 },
-	{ "KEY_2", SDLK_2 },
-	{ "KEY_3", SDLK_3 },
-	{ "KEY_4", SDLK_4 },
-	{ "KEY_5", SDLK_5 },
-	{ "KEY_6", SDLK_6 },
-	{ "KEY_7", SDLK_7 },
-	{ "KEY_8", SDLK_8 },
-	{ "KEY_9", SDLK_9 },
-	{ "KEY_0", SDLK_0 },
-	{ "KEY_MINUS", SDLK_MINUS },
-	{ "KEY_EQUALS", SDLK_EQUALS },
-	{ "KEY_BACK", SDLK_BACKSPACE },
-	{ "KEY_TAB", SDLK_TAB },
-	{ "KEY_Q", SDLK_q },
-	{ "KEY_W", SDLK_w },
-	{ "KEY_E", SDLK_e },
-	{ "KEY_R", SDLK_r },
-	{ "KEY_T", SDLK_t },
-	{ "KEY_Y", SDLK_y },
-	{ "KEY_U", SDLK_u },
-	{ "KEY_I", SDLK_i },
-	{ "KEY_O", SDLK_o },
-	{ "KEY_P", SDLK_p },
-	{ "KEY_LBRACKET", SDLK_LEFTBRACKET },
-	{ "KEY_RBRACKET", SDLK_RIGHTBRACKET },
-	{ "KEY_RETURN", SDLK_RETURN },
-	{ "KEY_LCONTROL", SDLK_LCTRL },
-	{ "KEY_A", SDLK_a },
-	{ "KEY_S", SDLK_s },
-	{ "KEY_D", SDLK_d },
-	{ "KEY_F", SDLK_f },
-	{ "KEY_G", SDLK_g },
-	{ "KEY_H", SDLK_h },
-	{ "KEY_J", SDLK_j },
-	{ "KEY_K", SDLK_k },
-	{ "KEY_L", SDLK_l },
-	{ "KEY_SEMICOLON", SDLK_SEMICOLON },
-	{ "KEY_APOSTROPHE", SDLK_QUOTE },
-	{ "KEY_GRAVE", SDLK_BACKQUOTE },
-	{ "KEY_LSHIFT", SDLK_LSHIFT },
-	{ "KEY_BACKSLASH", SDLK_BACKSLASH },
-	{ "KEY_Z", SDLK_z },
-	{ "KEY_X", SDLK_x },
-	{ "KEY_C", SDLK_c },
-	{ "KEY_V", SDLK_v },
-	{ "KEY_B", SDLK_b },
-	{ "KEY_N", SDLK_n },
-	{ "KEY_M", SDLK_m },
-	{ "KEY_COMMA", SDLK_COMMA },
-	{ "KEY_PERIOD", SDLK_PERIOD },
-	{ "KEY_SLASH", SDLK_SLASH },
-	{ "KEY_RSHIFT", SDLK_RSHIFT },
-	{ "KEY_MULTIPLY", SDLK_KP_MULTIPLY },
-	{ "KEY_LMENU", SDLK_LALT },
-	{ "KEY_SPACE", SDLK_SPACE },
-	{ "KEY_CAPITAL", SDLK_CAPSLOCK },
-	{ "KEY_F1", SDLK_F1 },
-	{ "KEY_F2", SDLK_F2 },
-	{ "KEY_F3", SDLK_F3 },
-	{ "KEY_F4", SDLK_F4 },
-	{ "KEY_F5", SDLK_F5 },
-	{ "KEY_F6", SDLK_F6 },
-	{ "KEY_F7", SDLK_F7 },
-	{ "KEY_F8", SDLK_F8 },
-	{ "KEY_F9", SDLK_F9 },
-	{ "KEY_F10", SDLK_F10 },
-	{ "KEY_NUMLOCK", SDLK_NUMLOCK },
-	{ "KEY_SCROLL", SDLK_SCROLLOCK },
-	{ "KEY_NUMPAD7", SDLK_KP7 },
-	{ "KEY_NUMPAD8", SDLK_KP8 },
-	{ "KEY_NUMPAD9", SDLK_KP9 },
-	{ "KEY_SUBTRACT", SDLK_KP_MINUS },
-	{ "KEY_NUMPAD4", SDLK_KP4 },
-	{ "KEY_NUMPAD5", SDLK_KP5 },
-	{ "KEY_NUMPAD6", SDLK_KP6 },
-	{ "KEY_ADD", SDLK_KP_PLUS },
-	{ "KEY_NUMPAD1", SDLK_KP1 },
-	{ "KEY_NUMPAD2", SDLK_KP2 },
-	{ "KEY_NUMPAD3", SDLK_KP3 },
-	{ "KEY_NUMPAD0", SDLK_KP0 },
-	{ "KEY_DECIMAL", SDLK_KP_PERIOD },
-	{ "KEY_F11", SDLK_F11 },
-	{ "KEY_F12", SDLK_F12 },
-	{ "KEY_F13", SDLK_F13 },
-	{ "KEY_F14", SDLK_F14 },
-	{ "KEY_F15", SDLK_F15 },
-	{ "KEY_STOP", SDLK_BREAK },
-	{ "KEY_NUMPADENTER", SDLK_KP_ENTER },
-	{ "KEY_RCONTROL", SDLK_RCTRL },
-	{ "KEY_DIVIDE", SDLK_KP_DIVIDE },
-	{ "KEY_SYSRQ", SDLK_SYSREQ },
-	{ "KEY_RMENU", SDLK_RALT },
-	{ "KEY_HOME", SDLK_HOME },
-	{ "KEY_UP", SDLK_UP },
-	{ "KEY_PRIOR", SDLK_PAGEUP },
-	{ "KEY_LEFT", SDLK_LEFT },
-	{ "KEY_RIGHT", SDLK_RIGHT },
-	{ "KEY_END", SDLK_END },
-	{ "KEY_DOWN", SDLK_DOWN },
-	{ "KEY_NEXT", SDLK_PAGEDOWN },
-	{ "KEY_INSERT", SDLK_INSERT },
-	{ "KEY_DELETE", SDLK_DELETE },
-	{ "KEY_LWIN", SDLK_LSUPER },
-	{ "KEY_RWIN", SDLK_RSUPER },
-	{ "KEY_APPS", SDLK_MENU },
-	{ "KEY_JOY1_B1", SDLK_JOY1_B1 },
-	{ "KEY_JOY1_B2", SDLK_JOY1_B2 },
-	{ "KEY_JOY1_B3", SDLK_JOY1_B3 },
-	{ "KEY_JOY1_B4", SDLK_JOY1_B4 },
-	{ "KEY_JOY1_B5", SDLK_JOY1_B5 },
-	{ "KEY_JOY1_B6", SDLK_JOY1_B6 },
-	{ "KEY_JOY1_B7", SDLK_JOY1_B7 },
-	{ "KEY_JOY1_B8", SDLK_JOY1_B8 },
-	{ "KEY_JOY1_B9", SDLK_JOY1_B9 },
-	{ "KEY_JOY1_B10", SDLK_JOY1_B10 },
-	{ "KEY_JOY1_HLEFT", SDLK_JOY1_HLEFT },
-	{ "KEY_JOY1_HUP", SDLK_JOY1_HUP },
-	{ "KEY_JOY1_HRIGHT", SDLK_JOY1_HRIGHT },
-	{ "KEY_JOY1_HDOWN", SDLK_JOY1_HDOWN },
-	{ "KEY_JOY2_B1", SDLK_JOY2_B1 },
-	{ "KEY_JOY2_B2", SDLK_JOY2_B2 },
-	{ "KEY_JOY2_B3", SDLK_JOY2_B3 },
-	{ "KEY_JOY2_B4", SDLK_JOY2_B4 },
-	{ "KEY_JOY2_B5", SDLK_JOY2_B5 },
-	{ "KEY_JOY2_B6", SDLK_JOY2_B6 },
-	{ "KEY_JOY2_B7", SDLK_JOY2_B7 },
-	{ "KEY_JOY2_B8", SDLK_JOY2_B8 },
-	{ "KEY_JOY2_B9", SDLK_JOY2_B9 },
-	{ "KEY_JOY2_B10", SDLK_JOY2_B10 },
-	{ "KEY_JOY2_HLEFT", SDLK_JOY2_HLEFT },
-	{ "KEY_JOY2_HUP", SDLK_JOY2_HUP },
-	{ "KEY_JOY2_HRIGHT", SDLK_JOY2_HRIGHT },
-	{ "KEY_JOY2_HDOWN", SDLK_JOY2_HDOWN },
-	{ "KEY_MOUSE_B1", SDLK_MOUSE_B1 },
-	{ "KEY_MOUSE_B2", SDLK_MOUSE_B2 },
-	{ "KEY_MOUSE_B3", SDLK_MOUSE_B3 },
-	{ "KEY_MOUSE_B4", SDLK_MOUSE_B4 },
-	{ "AXIS_JOY1_X", SDLK_AXIS_JOY1_X },
-	{ "AXIS_JOY1_Y", SDLK_AXIS_JOY1_Y },
-	{ "AXIS_JOY1_Z", SDLK_AXIS_JOY1_Z },
-	{ "AXIS_JOY1_R", SDLK_AXIS_JOY1_R },
-	{ "AXIS_JOY1_U", SDLK_AXIS_JOY1_U },
-	{ "AXIS_JOY1_V", SDLK_AXIS_JOY1_V },
-	{ "AXIS_JOY2_X", SDLK_AXIS_JOY2_X },
-	{ "AXIS_JOY2_Y", SDLK_AXIS_JOY2_Y },
-	{ "AXIS_JOY2_Z", SDLK_AXIS_JOY2_Z },
-	{ "AXIS_JOY2_R", SDLK_AXIS_JOY2_R },
-	{ "AXIS_JOY2_U", SDLK_AXIS_JOY2_U },
-	{ "AXIS_JOY2_V", SDLK_AXIS_JOY2_V },
-	{ "AXIS_MOUSE_X", SDLK_AXIS_MOUSE_X },
-	{ "AXIS_MOUSE_Y", SDLK_AXIS_MOUSE_Y },
-	{ "AXIS_MOUSE_Z", SDLK_AXIS_MOUSE_Z }
-};
-
 struct luaL_reg mainOpcodes[] = {
 	{ "EngineDisplay", EngineDisplay },
 	{ "CheckForFile", CheckForFile },
@@ -3869,7 +3701,8 @@
 	lua_pushobject(controls_table);
 	lua_settable();
 
-	for (unsigned i = 0; i < ARRAYSIZE(controls); i++) {
+	const Driver::ControlDescriptor *controls = g_driver->listControls();
+	for (unsigned i = 0; controls[i].name != NULL; i++) {
 		lua_pushobject(controls_table);
 		lua_pushstring(controls[i].name);
 		lua_pushnumber(controls[i].key);





More information about the Scummvm-git-logs mailing list