[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