Merge pull request #372 from zeldin/ouya

Basic OUYA support
This commit is contained in:
David Turner 2013-10-08 18:26:49 -07:00
commit d4d90b3f07
14 changed files with 205 additions and 4 deletions

View file

@ -146,7 +146,8 @@ OSystem_Android::OSystem_Android(int audio_sample_rate, int audio_buffer_size) :
_touchpad_scale(66),
_dpad_scale(4),
_fingersDown(0),
_trackball_scale(2) {
_trackball_scale(2),
_joystick_scale(10) {
_fsFactory = new POSIXFilesystemFactory();

View file

@ -231,6 +231,7 @@ private:
int _touchpad_scale;
int _trackball_scale;
int _dpad_scale;
int _joystick_scale;
int _fingersDown;
void clipMouse(Common::Point &p);

View file

@ -27,11 +27,14 @@ PORT_DISTFILES = $(PATH_DIST)/README.Android
RESOURCES = \
$(PATH_RESOURCES)/values/strings.xml \
$(PATH_RESOURCES)/values/margins.xml \
$(PATH_RESOURCES)/values-television/margins.xml \
$(PATH_RESOURCES)/layout/main.xml \
$(PATH_RESOURCES)/layout/splash.xml \
$(PATH_RESOURCES)/drawable/gradient.xml \
$(PATH_RESOURCES)/drawable/scummvm.png \
$(PATH_RESOURCES)/drawable/scummvm_big.png
$(PATH_RESOURCES)/drawable/scummvm_big.png \
$(PATH_RESOURCES)/drawable-xhdpi/ouya_icon.png
PLUGIN_RESOURCES = \
$(PATH_RESOURCES)/values/strings.xml \

View file

@ -64,6 +64,10 @@ enum {
JE_RMB_DOWN = 11,
JE_RMB_UP = 12,
JE_MOUSE_MOVE = 13,
JE_GAMEPAD = 14,
JE_JOYSTICK = 15,
JE_MMB_DOWN = 16,
JE_MMB_UP = 17,
JE_QUIT = 0x1000
};
@ -109,6 +113,25 @@ enum {
JKEYCODE_DPAD_CENTER = 23
};
// gamepad
enum {
JKEYCODE_BUTTON_A = 96,
JKEYCODE_BUTTON_B = 97,
JKEYCODE_BUTTON_C = 98,
JKEYCODE_BUTTON_X = 99,
JKEYCODE_BUTTON_Y = 100,
JKEYCODE_BUTTON_Z = 101,
JKEYCODE_BUTTON_L1 = 102,
JKEYCODE_BUTTON_R1 = 103,
JKEYCODE_BUTTON_L2 = 104,
JKEYCODE_BUTTON_R2 = 105,
JKEYCODE_BUTTON_THUMBL = 106,
JKEYCODE_BUTTON_THUMBR = 107,
JKEYCODE_BUTTON_START = 108,
JKEYCODE_BUTTON_SELECT = 109,
JKEYCODE_BUTTON_MODE = 110,
};
// meta modifier
enum {
JMETA_SHIFT = 0x01,
@ -827,6 +850,94 @@ void OSystem_Android::pushEvent(int type, int arg1, int arg2, int arg3,
return;
case JE_GAMEPAD:
switch (arg1) {
case JACTION_DOWN:
e.type = Common::EVENT_KEYDOWN;
break;
case JACTION_UP:
e.type = Common::EVENT_KEYUP;
break;
default:
LOGE("unhandled jaction on gamepad key: %d", arg1);
return;
}
switch (arg2) {
case JKEYCODE_BUTTON_A:
case JKEYCODE_BUTTON_B:
switch (arg1) {
case JACTION_DOWN:
e.type = (arg2 == JKEYCODE_BUTTON_A?
Common::EVENT_LBUTTONDOWN :
Common::EVENT_RBUTTONDOWN);
break;
case JACTION_UP:
e.type = (arg2 == JKEYCODE_BUTTON_A?
Common::EVENT_LBUTTONUP :
Common::EVENT_RBUTTONUP);
break;
}
e.mouse = getEventManager()->getMousePos();
break;
case JKEYCODE_BUTTON_X:
e.kbd.keycode = Common::KEYCODE_ESCAPE;
e.kbd.ascii = Common::ASCII_ESCAPE;
break;
default:
LOGW("unmapped gamepad key: %d", arg2);
return;
}
lockMutex(_event_queue_lock);
_event_queue.push(e);
unlockMutex(_event_queue_lock);
break;
case JE_JOYSTICK:
e.mouse = getEventManager()->getMousePos();
switch (arg1) {
case JACTION_MULTIPLE:
e.type = Common::EVENT_MOUSEMOVE;
// already multiplied by 100
e.mouse.x += arg2 * _joystick_scale / _eventScaleX;
e.mouse.y += arg3 * _joystick_scale / _eventScaleY;
clipMouse(e.mouse);
break;
default:
LOGE("unhandled jaction on joystick: %d", arg1);
return;
}
lockMutex(_event_queue_lock);
_event_queue.push(e);
unlockMutex(_event_queue_lock);
return;
case JE_MMB_DOWN:
e.type = Common::EVENT_MAINMENU;
lockMutex(_event_queue_lock);
_event_queue.push(e);
unlockMutex(_event_queue_lock);
return;
case JE_MMB_UP:
// No action
return;
case JE_QUIT:
e.type = Common::EVENT_QUIT;

View file

@ -14,6 +14,7 @@ public class MouseHelper {
private long _rmbGuardTime;
private boolean _rmbPressed;
private boolean _lmbPressed;
private boolean _mmbPressed;
/**
* Class initialization fails when this throws an exception.
@ -114,6 +115,23 @@ public class MouseHelper {
_rmbPressed = false;
}
boolean mmbDown = (buttonState & MotionEvent.BUTTON_TERTIARY) == MotionEvent.BUTTON_TERTIARY;
if (mmbDown) {
if (!_mmbPressed) {
// middle mouse button was pressed just now
_scummvm.pushEvent(ScummVMEvents.JE_MMB_DOWN, (int)e.getX(), (int)e.getY(), e.getButtonState(), 0, 0);
}
_mmbPressed = true;
} else {
if (_mmbPressed) {
// middle mouse button was released just now
_scummvm.pushEvent(ScummVMEvents.JE_MMB_UP, (int)e.getX(), (int)e.getY(), e.getButtonState(), 0, 0);
}
_mmbPressed = false;
}
return true;
}

View file

@ -240,6 +240,14 @@ public class ScummVMActivity extends Activity {
return false;
}
@Override
public boolean onGenericMotionEvent(final MotionEvent e) {
if (_events != null)
return _events.onGenericMotionEvent(e);
return false;
}
private void showKeyboard(boolean show) {
SurfaceView main_surface = (SurfaceView)findViewById(R.id.main_surface);
InputMethodManager imm = (InputMethodManager)

View file

@ -9,6 +9,7 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.GestureDetector;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodManager;
public class ScummVMEvents implements
@ -31,6 +32,10 @@ public class ScummVMEvents implements
public static final int JE_RMB_DOWN = 11;
public static final int JE_RMB_UP = 12;
public static final int JE_MOUSE_MOVE = 13;
public static final int JE_GAMEPAD = 14;
public static final int JE_JOYSTICK = 15;
public static final int JE_MMB_DOWN = 16;
public static final int JE_MMB_UP = 17;
public static final int JE_QUIT = 0x1000;
final protected Context _context;
@ -63,6 +68,18 @@ public class ScummVMEvents implements
return true;
}
public boolean onGenericMotionEvent(final MotionEvent e) {
if((e.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) {
_scummvm.pushEvent(JE_JOYSTICK, e.getAction(),
(int)(e.getAxisValue(MotionEvent.AXIS_X)*100),
(int)(e.getAxisValue(MotionEvent.AXIS_Y)*100),
0, 0);
return true;
}
return false;
}
final static int MSG_MENU_LONG_PRESS = 1;
final private Handler keyHandler = new Handler() {
@ -177,6 +194,25 @@ public class ScummVMEvents implements
(int)(e.getEventTime() - e.getDownTime()),
e.getRepeatCount(), 0);
return true;
case KeyEvent.KEYCODE_BUTTON_A:
case KeyEvent.KEYCODE_BUTTON_B:
case KeyEvent.KEYCODE_BUTTON_C:
case KeyEvent.KEYCODE_BUTTON_X:
case KeyEvent.KEYCODE_BUTTON_Y:
case KeyEvent.KEYCODE_BUTTON_Z:
case KeyEvent.KEYCODE_BUTTON_L1:
case KeyEvent.KEYCODE_BUTTON_R1:
case KeyEvent.KEYCODE_BUTTON_L2:
case KeyEvent.KEYCODE_BUTTON_R2:
case KeyEvent.KEYCODE_BUTTON_THUMBL:
case KeyEvent.KEYCODE_BUTTON_THUMBR:
case KeyEvent.KEYCODE_BUTTON_START:
case KeyEvent.KEYCODE_BUTTON_SELECT:
case KeyEvent.KEYCODE_BUTTON_MODE:
_scummvm.pushEvent(JE_GAMEPAD, action, keyCode,
(int)(e.getEventTime() - e.getDownTime()),
e.getRepeatCount(), 0);
return true;
}
_scummvm.pushEvent(JE_KEY, action, keyCode,