scummvm/backends/platform/dingux/dingux-events.cpp
2010-09-25 21:54:41 +00:00

215 lines
5.5 KiB
C++

/* 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/dingux/dingux.h"
#include "graphics/scaler/aspect.h" // for aspect2Real
#if defined (DINGUX)
#define PAD_UP SDLK_UP
#define PAD_DOWN SDLK_DOWN
#define PAD_LEFT SDLK_LEFT
#define PAD_RIGHT SDLK_RIGHT
#define BUT_A SDLK_LCTRL
#define BUT_B SDLK_LALT
#define BUT_X SDLK_SPACE
#define BUT_Y SDLK_LSHIFT
#define BUT_SELECT SDLK_ESCAPE
#define BUT_START SDLK_RETURN
#define TRIG_L SDLK_TAB
#define TRIG_R SDLK_BACKSPACE
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;
}
bool OSystem_SDL_Dingux::remapKey(SDL_Event &ev, Common::Event &event) {
if (ev.key.keysym.sym == PAD_UP) {
if (ev.type == SDL_KEYDOWN) {
_km.y_vel = -1;
_km.y_down_count = 1;
} else {
_km.y_vel = 0;
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_DOWN) {
if (ev.type == SDL_KEYDOWN) {
_km.y_vel = 1;
_km.y_down_count = 1;
} else {
_km.y_vel = 0;
_km.y_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_LEFT) {
if (ev.type == SDL_KEYDOWN) {
_km.x_vel = -1;
_km.x_down_count = 1;
} else {
_km.x_vel = 0;
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == PAD_RIGHT) {
if (ev.type == SDL_KEYDOWN) {
_km.x_vel = 1;
_km.x_down_count = 1;
} else {
_km.x_vel = 0;
_km.x_down_count = 0;
}
event.type = Common::EVENT_MOUSEMOVE;
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_Y) { // left mouse button
if (ev.type == SDL_KEYDOWN) {
event.type = Common::EVENT_LBUTTONDOWN;
} else {
event.type = Common::EVENT_LBUTTONUP;
}
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_B) { // right mouse button
if (ev.type == SDL_KEYDOWN) {
event.type = Common::EVENT_RBUTTONDOWN;
} else {
event.type = Common::EVENT_RBUTTONUP;
}
fillMouseEvent(event, _km.x, _km.y);
return true;
} else if (ev.key.keysym.sym == BUT_X) { // '.' skip dialogue
ev.key.keysym.sym = SDLK_PERIOD;
ev.key.keysym.mod = (SDLMod)0;
ev.key.keysym.unicode = '.';
} else if (ev.key.keysym.sym == TRIG_L) { // global menu
ev.key.keysym.sym = SDLK_F5;
event.kbd.keycode = Common::KEYCODE_F5;
event.kbd.ascii = Common::ASCII_F5;
event.kbd.flags = Common::KBD_CTRL;
if (ev.type == SDL_KEYDOWN) {
event.type = Common::EVENT_KEYDOWN;
} else {
event.type = Common::EVENT_KEYUP;
}
return true;
} else if (ev.key.keysym.sym == BUT_A) { // key '0'
ev.key.keysym.sym = SDLK_0;
event.kbd.keycode = Common::KEYCODE_0;
event.kbd.ascii = '0';
event.kbd.flags = 0;
if (ev.type == SDL_KEYDOWN) {
event.type = Common::EVENT_KEYDOWN;
} else {
event.type = Common::EVENT_KEYUP;
}
return true;
} else if (ev.key.keysym.sym == BUT_SELECT) { // virtual keyboard
ev.key.keysym.sym = SDLK_F7;
} else if (ev.key.keysym.sym == BUT_START) { // F5, menu in some games
ev.key.keysym.sym = SDLK_F5;
} else if (ev.key.keysym.sym == TRIG_R) { // ESC
ev.key.keysym.sym = SDLK_ESCAPE;
} else {
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 false;
}
void OSystem_SDL_Dingux::fillMouseEvent(Common::Event &event, int x, int y) {
if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
event.mouse.x = x * 2;
event.mouse.y = y * 2;
} else {
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) {
event.mouse.x /= _videoMode.scaleFactor;
event.mouse.y /= _videoMode.scaleFactor;
if (_videoMode.aspectRatioCorrection)
event.mouse.y = aspect2Real(event.mouse.y);
}
}
void OSystem_SDL_Dingux::warpMouse(int x, int y) {
if (_mouseCurState.x != x || _mouseCurState.y != y) {
if (_videoMode.mode == GFX_HALF && !_overlayVisible) {
x = x / 2;
y = y / 2;
}
}
OSystem_SDL::warpMouse(x, y);
}
#endif