/* 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 3 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, see .
*
*/
// Disable symbol overrides so that we can use system headers.
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "gui/message.h"
#include "common/translation.h"
#include "common/config-manager.h"
#include "backends/graphics/ios/ios-graphics.h"
#include "backends/platform/ios7/ios7_osys_main.h"
static const int kQueuedInputEventDelay = 50;
bool OSystem_iOS7::pollEvent(Common::Event &event) {
//printf("pollEvent()\n");
long curTime = getMillis();
if (_queuedInputEvent.type != Common::EVENT_INVALID && curTime >= _queuedEventTime) {
event = _queuedInputEvent;
_queuedInputEvent.type = Common::EVENT_INVALID;
return true;
}
InternalEvent internalEvent;
if (iOS7_fetchEvent(&internalEvent)) {
switch (internalEvent.type) {
case kInputTouchBegan:
if (!handleEvent_touchBegan(event, internalEvent.value1, internalEvent.value2))
return false;
break;
case kInputTouchMoved:
if (!handleEvent_touchMoved(event, internalEvent.value1, internalEvent.value2))
return false;
break;
case kInputMouseLeftButtonDown:
handleEvent_mouseLeftButtonDown(event, internalEvent.value1, internalEvent.value2);
break;
case kInputMouseLeftButtonUp:
handleEvent_mouseLeftButtonUp(event, internalEvent.value1, internalEvent.value2);
break;
case kInputMouseRightButtonDown:
handleEvent_mouseRightButtonDown(event, internalEvent.value1, internalEvent.value2);
break;
case kInputMouseRightButtonUp:
handleEvent_mouseRightButtonUp(event, internalEvent.value1, internalEvent.value2);
break;
case kInputMouseDelta:
handleEvent_mouseDelta(event, internalEvent.value1, internalEvent.value2);
break;
case kInputOrientationChanged:
handleEvent_orientationChanged(internalEvent.value1);
return false;
case kInputApplicationSuspended:
handleEvent_applicationSuspended();
return false;
case kInputApplicationResumed:
handleEvent_applicationResumed();
return false;
case kInputApplicationSaveState:
handleEvent_applicationSaveState();
return false;
case kInputApplicationRestoreState:
handleEvent_applicationRestoreState();
return false;
case kInputApplicationClearState:
handleEvent_applicationClearState();
return false;
case kInputKeyPressed:
handleEvent_keyPressed(event, internalEvent.value1, internalEvent.value2);
break;
case kInputSwipe:
if (!handleEvent_swipe(event, internalEvent.value1, internalEvent.value2))
return false;
break;
case kInputTap:
if (!handleEvent_tap(event, (UIViewTapDescription) internalEvent.value1, internalEvent.value2))
return false;
break;
case kInputLongPress:
if (!handleEvent_longPress(event, (UIViewLongPressDescription) internalEvent.value1, internalEvent.value2))
return false;
break;
case kInputMainMenu:
event.type = Common::EVENT_MAINMENU;
_queuedInputEvent.type = Common::EVENT_INVALID;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
break;
case kInputJoystickAxisMotion:
event.type = Common::EVENT_JOYAXIS_MOTION;
event.joystick.axis = internalEvent.value1;
event.joystick.position = internalEvent.value2;
break;
case kInputJoystickButtonDown:
event.type = Common::EVENT_JOYBUTTON_DOWN;
event.joystick.button = internalEvent.value1;
break;
case kInputJoystickButtonUp:
event.type = Common::EVENT_JOYBUTTON_UP;
event.joystick.button = internalEvent.value1;
break;
case kInputScreenChanged:
rebuildSurface();
dynamic_cast(_graphicsManager)->notifyResize(getScreenWidth(), getScreenHeight());
event.type = Common::EVENT_SCREEN_CHANGED;
break;
case kInputTouchModeChanged:
handleEvent_touchModeChanged();
break;
default:
break;
}
return true;
}
return false;
}
bool OSystem_iOS7::handleEvent_touchBegan(Common::Event &event, int x, int y) {
_lastPadX = x;
_lastPadY = y;
if (_currentTouchMode == kTouchModeDirect) {
Common::Point mouse(x, y);
dynamic_cast(_graphicsManager)->notifyMousePosition(mouse);
}
return false;
}
bool OSystem_iOS7::handleEvent_touchMoved(Common::Event &event, int x, int y) {
int deltaX = _lastPadX - x;
int deltaY = _lastPadY - y;
_lastPadX = x;
_lastPadY = y;
if (_currentTouchMode == kTouchModeTouchpad) {
handleEvent_mouseDelta(event, deltaX, deltaY);
} else {
// Update mouse position
Common::Point mousePos(x, y);
dynamic_cast(_graphicsManager)->notifyMousePosition(mousePos);
event.type = Common::EVENT_MOUSEMOVE;
handleEvent_mouseEvent(event, deltaX, deltaY);
}
return true;
}
void OSystem_iOS7::handleEvent_mouseLeftButtonDown(Common::Event &event, int x, int y) {
event.type = Common::EVENT_LBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
}
void OSystem_iOS7::handleEvent_mouseLeftButtonUp(Common::Event &event, int x, int y) {
event.type = Common::EVENT_LBUTTONUP;
handleEvent_mouseEvent(event, 0, 0);
}
void OSystem_iOS7::handleEvent_mouseRightButtonDown(Common::Event &event, int x, int y) {
event.type = Common::EVENT_RBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
}
void OSystem_iOS7::handleEvent_mouseRightButtonUp(Common::Event &event, int x, int y) {
event.type = Common::EVENT_RBUTTONUP;
handleEvent_mouseEvent(event, 0, 0);
}
void OSystem_iOS7::handleEvent_mouseDelta(Common::Event &event, int deltaX, int deltaY) {
Common::Point mouseOldPos = dynamic_cast(_graphicsManager)->getMousePosition();
Common::Point newMousePos((int)(mouseOldPos.x - (int)((float)deltaX * getMouseSpeed())), (int)(mouseOldPos.y - (int)((float)deltaY * getMouseSpeed())));
// Update mouse position
dynamic_cast(_graphicsManager)->notifyMousePosition(newMousePos);
event.type = Common::EVENT_MOUSEMOVE;
handleEvent_mouseEvent(event, deltaX, deltaY);
}
void OSystem_iOS7::handleEvent_mouseEvent(Common::Event &event, int relX, int relY) {
Common::Point mouse = dynamic_cast(_graphicsManager)->getMousePosition();
dynamic_cast(_graphicsManager)->notifyMousePosition(mouse);
event.relMouse.x = relX;
event.relMouse.y = relY;
event.mouse = mouse;
}
void OSystem_iOS7::handleEvent_orientationChanged(int orientation) {
//printf("Orientation: %i\n", orientation);
ScreenOrientation newOrientation = (ScreenOrientation)orientation;
if (_screenOrientation != newOrientation) {
_screenOrientation = newOrientation;
rebuildSurface();
}
}
void OSystem_iOS7::handleEvent_touchModeChanged() {
switch (_currentTouchMode) {
case kTouchModeDirect:
_currentTouchMode = kTouchModeTouchpad;
break;
case kTouchModeTouchpad:
default:
_currentTouchMode = kTouchModeDirect;
break;
}
updateTouchMode();
}
void OSystem_iOS7::rebuildSurface() {
updateOutputSurface();
}
void OSystem_iOS7::handleEvent_applicationSuspended() {
suspendLoop();
}
void OSystem_iOS7::handleEvent_applicationResumed() {
rebuildSurface();
}
void OSystem_iOS7::handleEvent_keyPressed(Common::Event &event, int keyPressed, int modifierFlags) {
int ascii = keyPressed;
//printf("key: %i\n", keyPressed);
// Map LF character to Return key/CR character
if (keyPressed == 10) {
keyPressed = Common::KEYCODE_RETURN;
ascii = Common::ASCII_RETURN;
}
event.type = Common::EVENT_KEYDOWN;
_queuedInputEvent.type = Common::EVENT_KEYUP;
event.kbd.flags = _queuedInputEvent.kbd.flags = modifierFlags;
event.kbd.keycode = _queuedInputEvent.kbd.keycode = (Common::KeyCode)keyPressed;
event.kbd.ascii = _queuedInputEvent.kbd.ascii = ascii;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
}
bool OSystem_iOS7::handleEvent_swipe(Common::Event &event, int direction, int touches) {
if (touches == 3) {
Common::KeyCode keycode = Common::KEYCODE_INVALID;
switch ((UIViewSwipeDirection)direction) {
case kUIViewSwipeUp:
keycode = Common::KEYCODE_UP;
break;
case kUIViewSwipeDown:
keycode = Common::KEYCODE_DOWN;
break;
case kUIViewSwipeLeft:
keycode = Common::KEYCODE_LEFT;
break;
case kUIViewSwipeRight:
keycode = Common::KEYCODE_RIGHT;
break;
default:
return false;
}
event.kbd.keycode = _queuedInputEvent.kbd.keycode = keycode;
event.kbd.ascii = _queuedInputEvent.kbd.ascii = 0;
event.type = Common::EVENT_KEYDOWN;
_queuedInputEvent.type = Common::EVENT_KEYUP;
event.kbd.flags = _queuedInputEvent.kbd.flags = 0;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
return true;
}
else if (touches == 2) {
switch ((UIViewSwipeDirection)direction) {
case kUIViewSwipeUp: {
return false;
}
case kUIViewSwipeDown: {
// Swipe down
event.type = Common::EVENT_MAINMENU;
_queuedInputEvent.type = Common::EVENT_INVALID;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
return true;
}
case kUIViewSwipeRight: {
// Swipe right
if (_currentTouchMode == kTouchModeDirect) {
_currentTouchMode = kTouchModeTouchpad;
} else {
_currentTouchMode = kTouchModeDirect;
}
updateTouchMode();
Common::U32String dialogMsg;
if (_currentTouchMode == kTouchModeTouchpad)
dialogMsg = _("Touchpad emulation");
else
dialogMsg = _("Direct mouse");
GUI::TimedMessageDialog dialog(dialogMsg, 1500);
dialog.runModal();
return false;
}
case kUIViewSwipeLeft: {
// Swipe left
bool connect = !ConfMan.getBool("gamepad_controller");
ConfMan.setBool("gamepad_controller", connect);
ConfMan.flushToDisk();
virtualController(connect);
return false;
}
default:
break;
}
}
return false;
}
bool OSystem_iOS7::handleEvent_tap(Common::Event &event, UIViewTapDescription type, int touches) {
if (touches == 1) {
if (type == kUIViewTapSingle) {
event.type = Common::EVENT_LBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
_queuedInputEvent.type = Common::EVENT_LBUTTONUP;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
handleEvent_mouseEvent(_queuedInputEvent, 0, 0);
return true;
}
} else if (touches == 2) {
if (type == kUIViewTapSingle) {
event.type = Common::EVENT_RBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
_queuedInputEvent.type = Common::EVENT_RBUTTONUP;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
handleEvent_mouseEvent(_queuedInputEvent, 0, 0);
return true;
} else if (type == kUIViewTapDouble) {
event.kbd.keycode = _queuedInputEvent.kbd.keycode = Common::KEYCODE_ESCAPE;
event.kbd.ascii = _queuedInputEvent.kbd.ascii = Common::ASCII_ESCAPE;
event.type = Common::EVENT_KEYDOWN;
_queuedInputEvent.type = Common::EVENT_KEYUP;
event.kbd.flags = _queuedInputEvent.kbd.flags = 0;
_queuedEventTime = getMillis() + kQueuedInputEventDelay;
return true;
}
}
return false;
}
bool OSystem_iOS7::handleEvent_longPress(Common::Event &event, UIViewLongPressDescription type, int touches) {
if (touches == 1) {
if (type == UIViewLongPressStarted) {
event.type = Common::EVENT_LBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
} else {
event.type = Common::EVENT_LBUTTONUP;
handleEvent_mouseEvent(event, 0, 0);
}
return true;
} else if (touches == 2) {
if (type == UIViewLongPressStarted) {
event.type = Common::EVENT_RBUTTONDOWN;
handleEvent_mouseEvent(event, 0, 0);
} else {
event.type = Common::EVENT_RBUTTONUP;
handleEvent_mouseEvent(event, 0, 0);
}
return true;
}
return false;
}