[Scummvm-cvs-logs] SF.net SVN: scummvm:[49635] scummvm/branches/gsoc2010-opengl/backends

vgvgf at users.sourceforge.net vgvgf at users.sourceforge.net
Sun Jun 13 22:31:25 CEST 2010


Revision: 49635
          http://scummvm.svn.sourceforge.net/scummvm/?rev=49635&view=rev
Author:   vgvgf
Date:     2010-06-13 20:31:25 +0000 (Sun, 13 Jun 2010)

Log Message:
-----------
Added SdlEventManager.

Modified Paths:
--------------
    scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.cpp
    scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.h

Added Paths:
-----------
    scummvm/branches/gsoc2010-opengl/backends/events/sdl/
    scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.cpp
    scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.h

Removed Paths:
-------------
    scummvm/branches/gsoc2010-opengl/backends/platform/sdl/events.cpp

Added: scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.cpp
===================================================================
--- scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.cpp	                        (rev 0)
+++ scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.cpp	2010-06-13 20:31:25 UTC (rev 49635)
@@ -0,0 +1,611 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#if defined(WIN32) || defined(UNIX) || defined(MACOSX)
+
+#include "backends/events/sdl/sdl-events.h"
+#include "backends/platform/sdl/sdl.h"
+#include "common/config-manager.h"
+
+// FIXME move joystick defines out and replace with confile file options
+// we should really allow users to map any key to a joystick button
+#define JOY_DEADZONE 3200
+
+#ifndef __SYMBIAN32__ // Symbian wants dialog joystick i.e cursor for movement/selection
+	#define JOY_ANALOG
+#endif
+
+// #define JOY_INVERT_Y
+#define JOY_XAXIS 0
+#define JOY_YAXIS 1
+// buttons
+#define JOY_BUT_LMOUSE 0
+#define JOY_BUT_RMOUSE 2
+#define JOY_BUT_ESCAPE 3
+#define JOY_BUT_PERIOD 1
+#define JOY_BUT_SPACE 4
+#define JOY_BUT_F5 5
+
+SdlEventManager::SdlEventManager(Common::EventSource *boss)
+	:
+	_scrollLock(false),
+	_joystick(0),
+	DefaultEventManager(boss) {
+
+	// reset mouse state
+	memset(&_km, 0, sizeof(_km));
+
+	int joystick_num = ConfMan.getInt("joystick_num");
+
+	if (joystick_num > -1) {
+		if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1) {
+			error("Could not initialize SDL: %s", SDL_GetError());
+		}
+	}
+
+	// enable joystick
+	if (joystick_num > -1 && SDL_NumJoysticks() > 0) {
+		printf("Using joystick: %s\n", SDL_JoystickName(0));
+		_joystick = SDL_JoystickOpen(joystick_num);
+	}
+
+}
+
+SdlEventManager::~SdlEventManager() {
+	if (_joystick)
+		SDL_JoystickClose(_joystick);
+}
+
+static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
+	if (key >= SDLK_F1 && key <= SDLK_F9) {
+		return key - SDLK_F1 + Common::ASCII_F1;
+	} else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
+		return key - SDLK_KP0 + '0';
+	} else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) {
+		return key;
+	} else if (unicode) {
+		return unicode;
+	} else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) {
+		return key & ~0x20;
+	} else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) {
+		return 0;
+	}
+	return key;
+}
+
+void SdlEventManager::fillMouseEvent(Common::Event &event, int x, int y) {
+	event.mouse.x = x;
+	event.mouse.y = y;
+
+	// Update the "keyboard mouse" coords
+	_km.x = x;
+	_km.y = y;
+
+	// Adjust for the screen scaling
+	/*if (!_overlayVisible) { // FIXME
+		event.mouse.x /= _videoMode.scaleFactor;
+		event.mouse.y /= _videoMode.scaleFactor;
+		if (_videoMode.aspectRatioCorrection)
+			event.mouse.y = aspect2Real(event.mouse.y);
+	}*/
+}
+
+void SdlEventManager::handleKbdMouse() {
+	uint32 curTime = g_system->getMillis();
+	if (curTime >= _km.last_time + _km.delay_time) {
+		_km.last_time = curTime;
+		if (_km.x_down_count == 1) {
+			_km.x_down_time = curTime;
+			_km.x_down_count = 2;
+		}
+		if (_km.y_down_count == 1) {
+			_km.y_down_time = curTime;
+			_km.y_down_count = 2;
+		}
+
+		if (_km.x_vel || _km.y_vel) {
+			if (_km.x_down_count) {
+				if (curTime > _km.x_down_time + _km.delay_time * 12) {
+					if (_km.x_vel > 0)
+						_km.x_vel++;
+					else
+						_km.x_vel--;
+				} else if (curTime > _km.x_down_time + _km.delay_time * 8) {
+					if (_km.x_vel > 0)
+						_km.x_vel = 5;
+					else
+						_km.x_vel = -5;
+				}
+			}
+			if (_km.y_down_count) {
+				if (curTime > _km.y_down_time + _km.delay_time * 12) {
+					if (_km.y_vel > 0)
+						_km.y_vel++;
+					else
+						_km.y_vel--;
+				} else if (curTime > _km.y_down_time + _km.delay_time * 8) {
+					if (_km.y_vel > 0)
+						_km.y_vel = 5;
+					else
+						_km.y_vel = -5;
+				}
+			}
+
+			_km.x += _km.x_vel;
+			_km.y += _km.y_vel;
+
+			if (_km.x < 0) {
+				_km.x = 0;
+				_km.x_vel = -1;
+				_km.x_down_count = 1;
+			} else if (_km.x > _km.x_max) {
+				_km.x = _km.x_max;
+				_km.x_vel = 1;
+				_km.x_down_count = 1;
+			}
+
+			if (_km.y < 0) {
+				_km.y = 0;
+				_km.y_vel = -1;
+				_km.y_down_count = 1;
+			} else if (_km.y > _km.y_max) {
+				_km.y = _km.y_max;
+				_km.y_vel = 1;
+				_km.y_down_count = 1;
+			}
+
+			SDL_WarpMouse((Uint16)_km.x, (Uint16)_km.y);
+		}
+	}
+}
+
+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)
+		event.kbd.flags |= Common::KBD_ALT;
+#else
+	if (mod & KMOD_SHIFT)
+		event.kbd.flags |= Common::KBD_SHIFT;
+	if (mod & KMOD_ALT)
+		event.kbd.flags |= Common::KBD_ALT;
+#endif
+	if (mod & KMOD_CTRL)
+		event.kbd.flags |= Common::KBD_CTRL;
+
+	// Sticky flags
+	if (mod & KMOD_NUM)
+		event.kbd.flags |= Common::KBD_NUM;
+	if (mod & KMOD_CAPS)
+		event.kbd.flags |= Common::KBD_CAPS;
+}
+
+bool SdlEventManager::pollSdlEvent(Common::Event &event) {
+	SDL_Event ev;
+
+	handleKbdMouse();
+
+	// If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED
+	/*if (_graphicsManager->_modeChanged) { // TODO: use getScreenChangeID
+		_graphicsManager->_modeChanged = false;
+		event.type = Common::EVENT_SCREEN_CHANGED;
+		return true;
+	}*/
+
+	while (SDL_PollEvent(&ev)) {
+		preprocessEvents(&ev);
+		if (dispatchSDLEvent(ev, event))
+			return true;
+	}
+	return false;
+}
+
+bool SdlEventManager::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
+	switch (ev.type) {
+	case SDL_KEYDOWN:
+		return handleKeyDown(ev, event);
+	case SDL_KEYUP:
+		return handleKeyUp(ev, event);
+	case SDL_MOUSEMOTION:
+		return handleMouseMotion(ev, event);
+	case SDL_MOUSEBUTTONDOWN:
+		return handleMouseButtonDown(ev, event);
+	case SDL_MOUSEBUTTONUP:
+		return handleMouseButtonUp(ev, event);
+	case SDL_JOYBUTTONDOWN:
+		return handleJoyButtonDown(ev, event);
+	case SDL_JOYBUTTONUP:
+		return handleJoyButtonUp(ev, event);
+	case SDL_JOYAXISMOTION:
+		return handleJoyAxisMotion(ev, event);
+
+	case SDL_VIDEOEXPOSE:
+		((OSystem_SDL *) g_system)->getGraphicsManager()->forceFullRedraw();
+		break;
+
+	case SDL_QUIT:
+		event.type = Common::EVENT_QUIT;
+		return true;
+
+	}
+
+	return false;
+}
+
+
+bool SdlEventManager::handleKeyDown(SDL_Event &ev, Common::Event &event) {
+
+	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
+	// TODO: make a function in graphics manager for this
+	/*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();
+#ifdef USE_OSD
+		if (_videoMode.fullscreen)
+			displayMessageOnOSD("Fullscreen mode");
+		else
+			displayMessageOnOSD("Windowed mode");
+#endif
+
+		return false;
+	}*/
+
+	// Alt-S: Create a screenshot
+	// TODO: make a function in graphics manager for this
+	/*if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') {
+		char filename[20];
+
+		for (int n = 0;; n++) {
+			SDL_RWops *file;
+
+			sprintf(filename, "scummvm%05d.bmp", n);
+			file = SDL_RWFromFile(filename, "r");
+			if (!file)
+				break;
+			SDL_RWclose(file);
+		}
+		if (saveScreenshot(filename))
+			printf("Saved '%s'\n", filename);
+		else
+			printf("Could not save screenshot!\n");
+		return false;
+	}*/
+
+	// Ctrl-m toggles mouse capture
+	if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') {
+		toggleMouseGrab();
+		return false;
+	}
+
+#if defined(MACOSX)
+	// On Macintosh', Cmd-Q quits
+	if ((ev.key.keysym.mod & KMOD_META) && ev.key.keysym.sym == 'q') {
+		event.type = Common::EVENT_QUIT;
+		return true;
+	}
+#elif defined(UNIX)
+	// On other unices, Control-Q quits
+	if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') {
+		event.type = Common::EVENT_QUIT;
+		return true;
+	}
+#else
+	// Ctrl-z and Alt-X quit
+	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;
+	}
+#endif
+
+	if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'u') {
+		event.type = Common::EVENT_MUTE;
+		return true;
+	}
+
+	// Ctrl-Alt-<key> will change the GFX mode
+	if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
+		if (((OSystem_SDL *) g_system)->getGraphicsManager()->handleScalerHotkeys(ev.key))
+			return false;
+	}
+
+	if (remapKey(ev, event))
+		return true;
+
+	event.type = Common::EVENT_KEYDOWN;
+	event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
+	event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+
+	return true;
+}
+
+bool SdlEventManager::handleKeyUp(SDL_Event &ev, Common::Event &event) {
+	if (remapKey(ev, event))
+		return true;
+
+	event.type = Common::EVENT_KEYUP;
+	event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
+	event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+
+	// Ctrl-Alt-<key> will change the GFX mode
+	SDLModToOSystemKeyFlags(SDL_GetModState(), event);
+
+	// Set the scroll lock sticky flag
+	if (_scrollLock)
+		event.kbd.flags |= Common::KBD_SCRL;
+
+	if (((OSystem_SDL *) g_system)->getGraphicsManager()->isScalerHotkey(event))
+		// Swallow these key up events
+		return false;
+
+	return true;
+}
+
+bool SdlEventManager::handleMouseMotion(SDL_Event &ev, Common::Event &event) {
+	event.type = Common::EVENT_MOUSEMOVE;
+	fillMouseEvent(event, ev.motion.x, ev.motion.y);
+
+	((OSystem_SDL *) g_system)->getGraphicsManager()->setMousePos(event.mouse.x, event.mouse.y);
+	return true;
+}
+
+bool SdlEventManager::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
+	if (ev.button.button == SDL_BUTTON_LEFT)
+		event.type = Common::EVENT_LBUTTONDOWN;
+	else if (ev.button.button == SDL_BUTTON_RIGHT)
+		event.type = Common::EVENT_RBUTTONDOWN;
+#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
+	else if (ev.button.button == SDL_BUTTON_WHEELUP)
+		event.type = Common::EVENT_WHEELUP;
+	else if (ev.button.button == SDL_BUTTON_WHEELDOWN)
+		event.type = Common::EVENT_WHEELDOWN;
+#endif
+#if defined(SDL_BUTTON_MIDDLE)
+	else if (ev.button.button == SDL_BUTTON_MIDDLE)
+		event.type = Common::EVENT_MBUTTONDOWN;
+#endif
+	else
+		return false;
+
+	fillMouseEvent(event, ev.button.x, ev.button.y);
+
+	return true;
+}
+
+bool SdlEventManager::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
+	if (ev.button.button == SDL_BUTTON_LEFT)
+		event.type = Common::EVENT_LBUTTONUP;
+	else if (ev.button.button == SDL_BUTTON_RIGHT)
+		event.type = Common::EVENT_RBUTTONUP;
+#if defined(SDL_BUTTON_MIDDLE)
+	else if (ev.button.button == SDL_BUTTON_MIDDLE)
+		event.type = Common::EVENT_MBUTTONUP;
+#endif
+	else
+		return false;
+	fillMouseEvent(event, ev.button.x, ev.button.y);
+
+	return true;
+}
+
+bool SdlEventManager::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
+	if (ev.jbutton.button == JOY_BUT_LMOUSE) {
+		event.type = Common::EVENT_LBUTTONDOWN;
+		fillMouseEvent(event, _km.x, _km.y);
+	} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
+		event.type = Common::EVENT_RBUTTONDOWN;
+		fillMouseEvent(event, _km.x, _km.y);
+	} else {
+		event.type = Common::EVENT_KEYDOWN;
+		switch (ev.jbutton.button) {
+		case JOY_BUT_ESCAPE:
+			event.kbd.keycode = Common::KEYCODE_ESCAPE;
+			event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_PERIOD:
+			event.kbd.keycode = Common::KEYCODE_PERIOD;
+			event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_SPACE:
+			event.kbd.keycode = Common::KEYCODE_SPACE;
+			event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_F5:
+			event.kbd.keycode = Common::KEYCODE_F5;
+			event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+			break;
+		}
+	}
+	return true;
+}
+
+bool SdlEventManager::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
+	if (ev.jbutton.button == JOY_BUT_LMOUSE) {
+		event.type = Common::EVENT_LBUTTONUP;
+		fillMouseEvent(event, _km.x, _km.y);
+	} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
+		event.type = Common::EVENT_RBUTTONUP;
+		fillMouseEvent(event, _km.x, _km.y);
+	} else {
+		event.type = Common::EVENT_KEYUP;
+		switch (ev.jbutton.button) {
+		case JOY_BUT_ESCAPE:
+			event.kbd.keycode = Common::KEYCODE_ESCAPE;
+			event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_PERIOD:
+			event.kbd.keycode = Common::KEYCODE_PERIOD;
+			event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_SPACE:
+			event.kbd.keycode = Common::KEYCODE_SPACE;
+			event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
+			break;
+		case JOY_BUT_F5:
+			event.kbd.keycode = Common::KEYCODE_F5;
+			event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+			break;
+		}
+	}
+	return true;
+}
+
+bool SdlEventManager::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
+	int axis = ev.jaxis.value;
+	if ( axis > JOY_DEADZONE) {
+		axis -= JOY_DEADZONE;
+		event.type = Common::EVENT_MOUSEMOVE;
+	} else if ( axis < -JOY_DEADZONE ) {
+		axis += JOY_DEADZONE;
+		event.type = Common::EVENT_MOUSEMOVE;
+	} else
+		axis = 0;
+
+	if ( ev.jaxis.axis == JOY_XAXIS) {
+#ifdef JOY_ANALOG
+		_km.x_vel = axis/2000;
+		_km.x_down_count = 0;
+#else
+		if (axis != 0) {
+			_km.x_vel = (axis > 0) ? 1:-1;
+			_km.x_down_count = 1;
+		} else {
+			_km.x_vel = 0;
+			_km.x_down_count = 0;
+		}
+#endif
+
+	} else if (ev.jaxis.axis == JOY_YAXIS) {
+#ifndef JOY_INVERT_Y
+		axis = -axis;
+#endif
+#ifdef JOY_ANALOG
+		_km.y_vel = -axis / 2000;
+		_km.y_down_count = 0;
+#else
+		if (axis != 0) {
+			_km.y_vel = (-axis > 0) ? 1: -1;
+			_km.y_down_count = 1;
+		} else {
+			_km.y_vel = 0;
+			_km.y_down_count = 0;
+		}
+#endif
+	}
+
+	fillMouseEvent(event, _km.x, _km.y);
+
+	return true;
+}
+
+bool SdlEventManager::remapKey(SDL_Event &ev, Common::Event &event) {
+#ifdef LINUPY
+	// On Yopy map the End button to quit
+	if ((ev.key.keysym.sym == 293)) {
+		event.type = Common::EVENT_QUIT;
+		return true;
+	}
+	// Map menu key to f5 (scumm menu)
+	if (ev.key.keysym.sym == 306) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_F5;
+		event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+		return true;
+	}
+	// Map action key to action
+	if (ev.key.keysym.sym == 291) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_TAB;
+		event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0);
+		return true;
+	}
+	// Map OK key to skip cinematic
+	if (ev.key.keysym.sym == 292) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_ESCAPE;
+		event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
+		return true;
+	}
+#endif
+
+#ifdef QTOPIA
+	// Quit on fn+backspace on zaurus
+	if (ev.key.keysym.sym == 127) {
+		event.type = Common::EVENT_QUIT;
+		return true;
+	}
+
+	// Map menu key (f11) to f5 (scumm menu)
+	if (ev.key.keysym.sym == SDLK_F11) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_F5;
+		event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
+	}
+	// Nap center (space) to tab (default action )
+	// I wanted to map the calendar button but the calendar comes up
+	//
+	else if (ev.key.keysym.sym == SDLK_SPACE) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_TAB;
+		event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0);
+	}
+	// Since we stole space (pause) above we'll rebind it to the tab key on the keyboard
+	else if (ev.key.keysym.sym == SDLK_TAB) {
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = Common::KEYCODE_SPACE;
+		event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
+	} else {
+	// Let the events fall through if we didn't change them, this may not be the best way to
+	// set it up, but i'm not sure how sdl would like it if we let if fall through then redid it though.
+	// and yes i have an huge terminal size so i dont wrap soon enough.
+		event.type = Common::EVENT_KEYDOWN;
+		event.kbd.keycode = ev.key.keysym.sym;
+		event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
+	}
+#endif
+	return false;
+}
+
+void SdlEventManager::toggleMouseGrab() {
+	if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF)
+		SDL_WM_GrabInput(SDL_GRAB_ON);
+	else
+		SDL_WM_GrabInput(SDL_GRAB_OFF);
+}
+
+#endif


Property changes on: scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.h
===================================================================
--- scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.h	                        (rev 0)
+++ scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.h	2010-06-13 20:31:25 UTC (rev 49635)
@@ -0,0 +1,85 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#if !defined(BACKEND_EVENTS_SDL_H) && !defined(DISABLE_DEFAULT_EVENTMANAGER)
+#define BACKEND_EVENTS_SDL_H
+
+#include "backends/events/default/default-events.h"
+
+#if defined(__SYMBIAN32__)
+#include <esdl\SDL.h>
+#else
+#include <SDL.h>
+#endif
+
+class SdlEventManager : public DefaultEventManager {
+public:
+	SdlEventManager(Common::EventSource *boss);
+	~SdlEventManager();
+
+	virtual bool pollSdlEvent(Common::Event &event);
+
+protected:
+	virtual void preprocessEvents(SDL_Event *event) {}
+
+	// Keyboard mouse emulation.  Disabled by fingolfin 2004-12-18.
+	// I am keeping the rest of the code in for now, since the joystick
+	// code (or rather, "hack") uses it, too.
+	struct KbdMouse {
+		int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
+		uint32 last_time, delay_time, x_down_time, y_down_time;
+	};
+
+	KbdMouse _km;
+
+	// Scroll lock state - since SDL doesn't track it
+	bool _scrollLock;
+	
+	// joystick
+	SDL_Joystick *_joystick;
+
+	virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event);
+
+	// Handlers for specific SDL events, called by pollEvent.
+	// This way, if a backend inherits fromt the SDL backend, it can
+	// change the behavior of only a single event, without having to override all
+	// of pollEvent.
+	virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event);
+	virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event);
+	virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event);
+	virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event);
+	virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event);
+	virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event);
+	virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event);
+	virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event);
+
+	virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend
+	void toggleMouseGrab();
+
+	void handleKbdMouse();
+	virtual bool remapKey(SDL_Event &ev, Common::Event &event);
+};
+
+#endif


Property changes on: scummvm/branches/gsoc2010-opengl/backends/events/sdl/sdl-events.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Deleted: scummvm/branches/gsoc2010-opengl/backends/platform/sdl/events.cpp
===================================================================
--- scummvm/branches/gsoc2010-opengl/backends/platform/sdl/events.cpp	2010-06-13 19:19:06 UTC (rev 49634)
+++ scummvm/branches/gsoc2010-opengl/backends/platform/sdl/events.cpp	2010-06-13 20:31:25 UTC (rev 49635)
@@ -1,581 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "backends/platform/sdl/sdl.h"
-#include "common/util.h"
-#include "common/events.h"
-#include "graphics/scaler/aspect.h"	// for aspect2Real
-
-// FIXME move joystick defines out and replace with confile file options
-// we should really allow users to map any key to a joystick button
-#define JOY_DEADZONE 3200
-
-#ifndef __SYMBIAN32__ // Symbian wants dialog joystick i.e cursor for movement/selection
-	#define JOY_ANALOG
-#endif
-
-// #define JOY_INVERT_Y
-#define JOY_XAXIS 0
-#define JOY_YAXIS 1
-// buttons
-#define JOY_BUT_LMOUSE 0
-#define JOY_BUT_RMOUSE 2
-#define JOY_BUT_ESCAPE 3
-#define JOY_BUT_PERIOD 1
-#define JOY_BUT_SPACE 4
-#define JOY_BUT_F5 5
-
-
-
-
-static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
-	if (key >= SDLK_F1 && key <= SDLK_F9) {
-		return key - SDLK_F1 + Common::ASCII_F1;
-	} else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
-		return key - SDLK_KP0 + '0';
-	} else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) {
-		return key;
-	} else if (unicode) {
-		return unicode;
-	} else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) {
-		return key & ~0x20;
-	} else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) {
-		return 0;
-	}
-	return key;
-}
-
-void OSystem_SDL::fillMouseEvent(Common::Event &event, int x, int y) {
-	event.mouse.x = x;
-	event.mouse.y = y;
-
-	// Update the "keyboard mouse" coords
-	_km.x = x;
-	_km.y = y;
-
-	// Adjust for the screen scaling
-	/*if (!_overlayVisible) { // FIXME
-		event.mouse.x /= _videoMode.scaleFactor;
-		event.mouse.y /= _videoMode.scaleFactor;
-		if (_videoMode.aspectRatioCorrection)
-			event.mouse.y = aspect2Real(event.mouse.y);
-	}*/
-}
-
-void OSystem_SDL::handleKbdMouse() {
-	uint32 curTime = getMillis();
-	if (curTime >= _km.last_time + _km.delay_time) {
-		_km.last_time = curTime;
-		if (_km.x_down_count == 1) {
-			_km.x_down_time = curTime;
-			_km.x_down_count = 2;
-		}
-		if (_km.y_down_count == 1) {
-			_km.y_down_time = curTime;
-			_km.y_down_count = 2;
-		}
-
-		if (_km.x_vel || _km.y_vel) {
-			if (_km.x_down_count) {
-				if (curTime > _km.x_down_time + _km.delay_time * 12) {
-					if (_km.x_vel > 0)
-						_km.x_vel++;
-					else
-						_km.x_vel--;
-				} else if (curTime > _km.x_down_time + _km.delay_time * 8) {
-					if (_km.x_vel > 0)
-						_km.x_vel = 5;
-					else
-						_km.x_vel = -5;
-				}
-			}
-			if (_km.y_down_count) {
-				if (curTime > _km.y_down_time + _km.delay_time * 12) {
-					if (_km.y_vel > 0)
-						_km.y_vel++;
-					else
-						_km.y_vel--;
-				} else if (curTime > _km.y_down_time + _km.delay_time * 8) {
-					if (_km.y_vel > 0)
-						_km.y_vel = 5;
-					else
-						_km.y_vel = -5;
-				}
-			}
-
-			_km.x += _km.x_vel;
-			_km.y += _km.y_vel;
-
-			if (_km.x < 0) {
-				_km.x = 0;
-				_km.x_vel = -1;
-				_km.x_down_count = 1;
-			} else if (_km.x > _km.x_max) {
-				_km.x = _km.x_max;
-				_km.x_vel = 1;
-				_km.x_down_count = 1;
-			}
-
-			if (_km.y < 0) {
-				_km.y = 0;
-				_km.y_vel = -1;
-				_km.y_down_count = 1;
-			} else if (_km.y > _km.y_max) {
-				_km.y = _km.y_max;
-				_km.y_vel = 1;
-				_km.y_down_count = 1;
-			}
-
-			SDL_WarpMouse((Uint16)_km.x, (Uint16)_km.y);
-		}
-	}
-}
-
-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)
-		event.kbd.flags |= Common::KBD_ALT;
-#else
-	if (mod & KMOD_SHIFT)
-		event.kbd.flags |= Common::KBD_SHIFT;
-	if (mod & KMOD_ALT)
-		event.kbd.flags |= Common::KBD_ALT;
-#endif
-	if (mod & KMOD_CTRL)
-		event.kbd.flags |= Common::KBD_CTRL;
-
-	// 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) {
-	SDL_Event ev;
-
-	handleKbdMouse();
-
-	// If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED
-	/*if (_graphicsManager->_modeChanged) { // TODO: use getScreenChangeID
-		_graphicsManager->_modeChanged = false;
-		event.type = Common::EVENT_SCREEN_CHANGED;
-		return true;
-	}*/
-
-	while (SDL_PollEvent(&ev)) {
-		preprocessEvents(&ev);
-		if (dispatchSDLEvent(ev, event))
-			return true;
-	}
-	return false;
-}
-
-bool OSystem_SDL::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) {
-	switch (ev.type) {
-	case SDL_KEYDOWN:
-		return handleKeyDown(ev, event);
-	case SDL_KEYUP:
-		return handleKeyUp(ev, event);
-	case SDL_MOUSEMOTION:
-		return handleMouseMotion(ev, event);
-	case SDL_MOUSEBUTTONDOWN:
-		return handleMouseButtonDown(ev, event);
-	case SDL_MOUSEBUTTONUP:
-		return handleMouseButtonUp(ev, event);
-	case SDL_JOYBUTTONDOWN:
-		return handleJoyButtonDown(ev, event);
-	case SDL_JOYBUTTONUP:
-		return handleJoyButtonUp(ev, event);
-	case SDL_JOYAXISMOTION:
-		return handleJoyAxisMotion(ev, event);
-
-	case SDL_VIDEOEXPOSE:
-		((SdlGraphicsManager *)_graphicsManager)->forceFullRedraw();
-		break;
-
-	case SDL_QUIT:
-		event.type = Common::EVENT_QUIT;
-		return true;
-
-	}
-
-	return false;
-}
-
-
-bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) {
-
-	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
-	// TODO: make a function in graphics manager for this
-	/*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();
-#ifdef USE_OSD
-		if (_videoMode.fullscreen)
-			displayMessageOnOSD("Fullscreen mode");
-		else
-			displayMessageOnOSD("Windowed mode");
-#endif
-
-		return false;
-	}*/
-
-	// Alt-S: Create a screenshot
-	// TODO: make a function in graphics manager for this
-	/*if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') {
-		char filename[20];
-
-		for (int n = 0;; n++) {
-			SDL_RWops *file;
-
-			sprintf(filename, "scummvm%05d.bmp", n);
-			file = SDL_RWFromFile(filename, "r");
-			if (!file)
-				break;
-			SDL_RWclose(file);
-		}
-		if (saveScreenshot(filename))
-			printf("Saved '%s'\n", filename);
-		else
-			printf("Could not save screenshot!\n");
-		return false;
-	}*/
-
-	// Ctrl-m toggles mouse capture
-	if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') {
-		toggleMouseGrab();
-		return false;
-	}
-
-#if defined(MACOSX)
-	// On Macintosh', Cmd-Q quits
-	if ((ev.key.keysym.mod & KMOD_META) && ev.key.keysym.sym == 'q') {
-		event.type = Common::EVENT_QUIT;
-		return true;
-	}
-#elif defined(UNIX)
-	// On other unices, Control-Q quits
-	if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') {
-		event.type = Common::EVENT_QUIT;
-		return true;
-	}
-#else
-	// Ctrl-z and Alt-X quit
-	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;
-	}
-#endif
-
-	if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'u') {
-		event.type = Common::EVENT_MUTE;
-		return true;
-	}
-
-	// Ctrl-Alt-<key> will change the GFX mode
-	if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
-		if (((SdlGraphicsManager *)_graphicsManager)->handleScalerHotkeys(ev.key))
-			return false;
-	}
-
-	if (remapKey(ev, event))
-		return true;
-
-	event.type = Common::EVENT_KEYDOWN;
-	event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
-	event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
-
-	return true;
-}
-
-bool OSystem_SDL::handleKeyUp(SDL_Event &ev, Common::Event &event) {
-	if (remapKey(ev, event))
-		return true;
-
-	event.type = Common::EVENT_KEYUP;
-	event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym;
-	event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
-
-	// Ctrl-Alt-<key> will change the GFX mode
-	SDLModToOSystemKeyFlags(SDL_GetModState(), event);
-
-	// Set the scroll lock sticky flag
-	if (_scrollLock)
-		event.kbd.flags |= Common::KBD_SCRL;
-
-	if (((SdlGraphicsManager *)_graphicsManager)->isScalerHotkey(event))
-		// Swallow these key up events
-		return false;
-
-	return true;
-}
-
-bool OSystem_SDL::handleMouseMotion(SDL_Event &ev, Common::Event &event) {
-	event.type = Common::EVENT_MOUSEMOVE;
-	fillMouseEvent(event, ev.motion.x, ev.motion.y);
-
-	((SdlGraphicsManager *)_graphicsManager)->setMousePos(event.mouse.x, event.mouse.y);
-	return true;
-}
-
-bool OSystem_SDL::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) {
-	if (ev.button.button == SDL_BUTTON_LEFT)
-		event.type = Common::EVENT_LBUTTONDOWN;
-	else if (ev.button.button == SDL_BUTTON_RIGHT)
-		event.type = Common::EVENT_RBUTTONDOWN;
-#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN)
-	else if (ev.button.button == SDL_BUTTON_WHEELUP)
-		event.type = Common::EVENT_WHEELUP;
-	else if (ev.button.button == SDL_BUTTON_WHEELDOWN)
-		event.type = Common::EVENT_WHEELDOWN;
-#endif
-#if defined(SDL_BUTTON_MIDDLE)
-	else if (ev.button.button == SDL_BUTTON_MIDDLE)
-		event.type = Common::EVENT_MBUTTONDOWN;
-#endif
-	else
-		return false;
-
-	fillMouseEvent(event, ev.button.x, ev.button.y);
-
-	return true;
-}
-
-bool OSystem_SDL::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) {
-	if (ev.button.button == SDL_BUTTON_LEFT)
-		event.type = Common::EVENT_LBUTTONUP;
-	else if (ev.button.button == SDL_BUTTON_RIGHT)
-		event.type = Common::EVENT_RBUTTONUP;
-#if defined(SDL_BUTTON_MIDDLE)
-	else if (ev.button.button == SDL_BUTTON_MIDDLE)
-		event.type = Common::EVENT_MBUTTONUP;
-#endif
-	else
-		return false;
-	fillMouseEvent(event, ev.button.x, ev.button.y);
-
-	return true;
-}
-
-bool OSystem_SDL::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
-	if (ev.jbutton.button == JOY_BUT_LMOUSE) {
-		event.type = Common::EVENT_LBUTTONDOWN;
-		fillMouseEvent(event, _km.x, _km.y);
-	} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
-		event.type = Common::EVENT_RBUTTONDOWN;
-		fillMouseEvent(event, _km.x, _km.y);
-	} else {
-		event.type = Common::EVENT_KEYDOWN;
-		switch (ev.jbutton.button) {
-		case JOY_BUT_ESCAPE:
-			event.kbd.keycode = Common::KEYCODE_ESCAPE;
-			event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_PERIOD:
-			event.kbd.keycode = Common::KEYCODE_PERIOD;
-			event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_SPACE:
-			event.kbd.keycode = Common::KEYCODE_SPACE;
-			event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_F5:
-			event.kbd.keycode = Common::KEYCODE_F5;
-			event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
-			break;
-		}
-	}
-	return true;
-}
-
-bool OSystem_SDL::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
-	if (ev.jbutton.button == JOY_BUT_LMOUSE) {
-		event.type = Common::EVENT_LBUTTONUP;
-		fillMouseEvent(event, _km.x, _km.y);
-	} else if (ev.jbutton.button == JOY_BUT_RMOUSE) {
-		event.type = Common::EVENT_RBUTTONUP;
-		fillMouseEvent(event, _km.x, _km.y);
-	} else {
-		event.type = Common::EVENT_KEYUP;
-		switch (ev.jbutton.button) {
-		case JOY_BUT_ESCAPE:
-			event.kbd.keycode = Common::KEYCODE_ESCAPE;
-			event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_PERIOD:
-			event.kbd.keycode = Common::KEYCODE_PERIOD;
-			event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_SPACE:
-			event.kbd.keycode = Common::KEYCODE_SPACE;
-			event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
-			break;
-		case JOY_BUT_F5:
-			event.kbd.keycode = Common::KEYCODE_F5;
-			event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
-			break;
-		}
-	}
-	return true;
-}
-
-bool OSystem_SDL::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
-	int axis = ev.jaxis.value;
-	if ( axis > JOY_DEADZONE) {
-		axis -= JOY_DEADZONE;
-		event.type = Common::EVENT_MOUSEMOVE;
-	} else if ( axis < -JOY_DEADZONE ) {
-		axis += JOY_DEADZONE;
-		event.type = Common::EVENT_MOUSEMOVE;
-	} else
-		axis = 0;
-
-	if ( ev.jaxis.axis == JOY_XAXIS) {
-#ifdef JOY_ANALOG
-		_km.x_vel = axis/2000;
-		_km.x_down_count = 0;
-#else
-		if (axis != 0) {
-			_km.x_vel = (axis > 0) ? 1:-1;
-			_km.x_down_count = 1;
-		} else {
-			_km.x_vel = 0;
-			_km.x_down_count = 0;
-		}
-#endif
-
-	} else if (ev.jaxis.axis == JOY_YAXIS) {
-#ifndef JOY_INVERT_Y
-		axis = -axis;
-#endif
-#ifdef JOY_ANALOG
-		_km.y_vel = -axis / 2000;
-		_km.y_down_count = 0;
-#else
-		if (axis != 0) {
-			_km.y_vel = (-axis > 0) ? 1: -1;
-			_km.y_down_count = 1;
-		} else {
-			_km.y_vel = 0;
-			_km.y_down_count = 0;
-		}
-#endif
-	}
-
-	fillMouseEvent(event, _km.x, _km.y);
-
-	return true;
-}
-
-bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) {
-#ifdef LINUPY
-	// On Yopy map the End button to quit
-	if ((ev.key.keysym.sym == 293)) {
-		event.type = Common::EVENT_QUIT;
-		return true;
-	}
-	// Map menu key to f5 (scumm menu)
-	if (ev.key.keysym.sym == 306) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_F5;
-		event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
-		return true;
-	}
-	// Map action key to action
-	if (ev.key.keysym.sym == 291) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_TAB;
-		event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0);
-		return true;
-	}
-	// Map OK key to skip cinematic
-	if (ev.key.keysym.sym == 292) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_ESCAPE;
-		event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0);
-		return true;
-	}
-#endif
-
-#ifdef QTOPIA
-	// Quit on fn+backspace on zaurus
-	if (ev.key.keysym.sym == 127) {
-		event.type = Common::EVENT_QUIT;
-		return true;
-	}
-
-	// Map menu key (f11) to f5 (scumm menu)
-	if (ev.key.keysym.sym == SDLK_F11) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_F5;
-		event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0);
-	}
-	// Nap center (space) to tab (default action )
-	// I wanted to map the calendar button but the calendar comes up
-	//
-	else if (ev.key.keysym.sym == SDLK_SPACE) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_TAB;
-		event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0);
-	}
-	// Since we stole space (pause) above we'll rebind it to the tab key on the keyboard
-	else if (ev.key.keysym.sym == SDLK_TAB) {
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = Common::KEYCODE_SPACE;
-		event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0);
-	} else {
-	// Let the events fall through if we didn't change them, this may not be the best way to
-	// set it up, but i'm not sure how sdl would like it if we let if fall through then redid it though.
-	// and yes i have an huge terminal size so i dont wrap soon enough.
-		event.type = Common::EVENT_KEYDOWN;
-		event.kbd.keycode = ev.key.keysym.sym;
-		event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode);
-	}
-#endif
-	return false;
-}
-
-void OSystem_SDL::toggleMouseGrab() {
-	if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF)
-		SDL_WM_GrabInput(SDL_GRAB_ON);
-	else
-		SDL_WM_GrabInput(SDL_GRAB_OFF);
-}

Modified: scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.cpp
===================================================================
--- scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.cpp	2010-06-13 19:19:06 UTC (rev 49634)
+++ scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.cpp	2010-06-13 20:31:25 UTC (rev 49635)
@@ -45,6 +45,8 @@
 
 #include "backends/mixer/sdl/sdl-mixer.h"
 
+#include "backends/events/sdl/sdl-events.h"
+
 #include "icons/scummvm.xpm"
 
 #include <time.h>	// for getTimeAndDate()
@@ -86,15 +88,11 @@
 void OSystem_SDL::initBackend() {
 	assert(!_inited);
 
-	int joystick_num = ConfMan.getInt("joystick_num");
 	uint32 sdlFlags = 0;
 
 	if (ConfMan.hasKey("disable_sdl_parachute"))
 		sdlFlags |= SDL_INIT_NOPARACHUTE;
 
-	if (joystick_num > -1)
-		sdlFlags |= SDL_INIT_JOYSTICK;
-
 	if (SDL_Init(sdlFlags) == -1) {
 		error("Could not initialize SDL: %s", SDL_GetError());
 	}
@@ -108,16 +106,10 @@
 		_mutexManager = new SdlMutexManager();
 	}
 
-	// enable joystick
-	if (joystick_num > -1 && SDL_NumJoysticks() > 0) {
-		printf("Using joystick: %s\n", SDL_JoystickName(0));
-		_joystick = SDL_JoystickOpen(joystick_num);
-	}
-
 	// Create and hook up the event manager, if none exists yet (we check for
 	// this to allow subclasses to provide their own).
 	if (_eventManager == 0) {
-		_eventManager = new DefaultEventManager(this);
+		_eventManager = new SdlEventManager(this);
 	}
 
 	// Create the savefile manager, if none exists yet (we check for this to
@@ -177,14 +169,7 @@
 
 OSystem_SDL::OSystem_SDL()
 	:
-	_scrollLock(false),
-	_joystick(0) {
-
-	// reset mouse state
-	memset(&_km, 0, sizeof(_km));
-
-	_inited = false;
-
+	_inited(false) {
 	#if defined(__amigaos4__)
 		_fsFactory = new AmigaOSFilesystemFactory();
 	#elif defined(UNIX)
@@ -351,9 +336,6 @@
 }
 
 void OSystem_SDL::deinit() {
-	if (_joystick)
-		SDL_JoystickClose(_joystick);
-
 	SDL_ShowCursor(SDL_ENABLE);
 
 	SDL_RemoveTimer(_timerID);
@@ -366,7 +348,7 @@
 
 	// Event Manager requires save manager for storing
 	// recorded events
-	delete getEventManager();
+	delete _eventManager;
 	delete _savefileManager;
 }
 
@@ -429,3 +411,13 @@
 	SDL_FreeSurface(sdl_surf);
 	free(icon);
 }
+
+SdlGraphicsManager *OSystem_SDL::getGraphicsManager() {
+	assert(_graphicsManager);
+	return (SdlGraphicsManager *)_graphicsManager;
+}
+
+bool OSystem_SDL::pollEvent(Common::Event &event) {
+	assert(_eventManager);
+	return ((SdlEventManager *)_eventManager)->pollSdlEvent(event);
+}

Modified: scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.h
===================================================================
--- scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.h	2010-06-13 19:19:06 UTC (rev 49634)
+++ scummvm/branches/gsoc2010-opengl/backends/platform/sdl/sdl.h	2010-06-13 20:31:25 UTC (rev 49635)
@@ -65,15 +65,9 @@
 
 	virtual void getTimeAndDate(TimeDate &t) const;
 
-	// Get the next event.
-	// Returns true if an event was retrieved.
-	virtual bool pollEvent(Common::Event &event); // overloaded by CE backend
-
 	// Define all hardware keys for keymapper
 	virtual Common::HardwareKeySet *getHardwareKeySet();
 
-	virtual void preprocessEvents(SDL_Event *event) {}
-
 	// Quit
 	virtual void quit(); // overloaded by CE backend
 
@@ -85,50 +79,16 @@
 	virtual Common::SeekableReadStream *createConfigReadStream();
 	virtual Common::WriteStream *createConfigWriteStream();
 
+	SdlGraphicsManager *getGraphicsManager();
+
+	virtual bool pollEvent(Common::Event &event);
+
 protected:
 	bool _inited;
 
-	// Keyboard mouse emulation.  Disabled by fingolfin 2004-12-18.
-	// I am keeping the rest of the code in for now, since the joystick
-	// code (or rather, "hack") uses it, too.
-	struct KbdMouse {
-		int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count;
-		uint32 last_time, delay_time, x_down_time, y_down_time;
-	};
-
-	KbdMouse _km;
-
-	// Scroll lock state - since SDL doesn't track it
-	bool _scrollLock;
-	
-	// joystick
-	SDL_Joystick *_joystick;
-
-	virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event);
-
-	// Handlers for specific SDL events, called by pollEvent.
-	// This way, if a backend inherits fromt the SDL backend, it can
-	// change the behavior of only a single event, without having to override all
-	// of pollEvent.
-	virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event);
-	virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event);
-	virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event);
-	virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event);
-	virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event);
-	virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event);
-	virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event);
-	virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event);
-
 	SDL_TimerID _timerID;
 
-	virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend
-	void toggleMouseGrab();
-
-	void handleKbdMouse();
-
 	void setupIcon();
-
-	virtual bool remapKey(SDL_Event &ev, Common::Event &event);
 };
 
 #endif


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