1
0
mirror of https://github.com/libretro/RetroArch synced 2025-03-26 20:37:10 +00:00

(Android) Create input_state for Android app - can now signal that a window

was created, or that we want to shutdown
This commit is contained in:
twinaphex 2012-11-02 22:26:33 +01:00
parent 6ce23c57df
commit 02f81a38c2
4 changed files with 67 additions and 46 deletions

@ -23,8 +23,15 @@
struct droid struct droid
{ {
struct android_app* app; struct android_app* app;
bool init_quit; uint64_t input_state;
bool window_inited; };
enum {
ANDROID_STATE_QUIT = 1 << 0,
ANDROID_STATE_KILL = 1 << 1,
ANDROID_STATE_VOLUME_UP = 1 << 2,
ANDROID_STATE_VOLUME_DOWN = 1 << 3,
ANDROID_WINDOW_READY = 1 << 4,
}; };
extern struct droid g_android; extern struct droid g_android;

@ -49,27 +49,19 @@ enum {
#define PRESSED_LEFT(x, y) ((-0.80f > x) && (x >= -1.00f)) #define PRESSED_LEFT(x, y) ((-0.80f > x) && (x >= -1.00f))
#define PRESSED_RIGHT(x, y) ((0.80f < x) && (x <= 1.00f)) #define PRESSED_RIGHT(x, y) ((0.80f < x) && (x <= 1.00f))
#define MAX_DEVICE_IDS 50
//#define RARCH_INPUT_DEBUG //#define RARCH_INPUT_DEBUG
static unsigned pads_connected; static unsigned pads_connected;
static uint64_t state[MAX_PADS]; static uint64_t state[MAX_PADS];
static int16_t state_device_ids[50]; static int8_t state_device_ids[MAX_DEVICE_IDS];
static int32_t keycode_lut[LAST_KEYCODE]; static int32_t keycode_lut[LAST_KEYCODE];
static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) static int32_t handle_touch(AInputEvent* event, int i, int keycode)
{ {
RARCH_PERFORMANCE_INIT(handle_input); RARCH_PERFORMANCE_INIT(handle_touch);
RARCH_PERFORMANCE_START(handle_input); RARCH_PERFORMANCE_START(handle_touch);
int id = AInputEvent_getDeviceId(event);
int i = state_device_ids[id];
if(i == -1)
i = state_device_ids[id] = pads_connected++;
int type = AInputEvent_getType(event);
int keycode = AKeyEvent_getKeyCode(event);
#ifdef RARCH_INPUT_DEBUG #ifdef RARCH_INPUT_DEBUG
int source = AInputEvent_getSource(event); int source = AInputEvent_getSource(event);
@ -94,34 +86,35 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
} }
#endif #endif
int action = AKeyEvent_getAction(event); float x = AMotionEvent_getX(event, 0);
float y = AMotionEvent_getY(event, 0);
if(type == AINPUT_EVENT_TYPE_MOTION)
{
float x = AMotionEvent_getX(event, 0);
float y = AMotionEvent_getY(event, 0);
#ifdef RARCH_INPUT_DEBUG #ifdef RARCH_INPUT_DEBUG
RARCH_LOG("AINPUT_EVENT_TYPE_MOTION, pad: %d, x: %f, y: %f.\n", i, x, y); RARCH_LOG("AINPUT_EVENT_TYPE_MOTION, pad: %d, x: %f, y: %f.\n", i, x, y);
#endif #endif
state[i] &= ~(ANDROID_GAMEPAD_DPAD_LEFT | ANDROID_GAMEPAD_DPAD_RIGHT | state[i] &= ~(ANDROID_GAMEPAD_DPAD_LEFT | ANDROID_GAMEPAD_DPAD_RIGHT |
ANDROID_GAMEPAD_DPAD_UP | ANDROID_GAMEPAD_DPAD_DOWN); ANDROID_GAMEPAD_DPAD_UP | ANDROID_GAMEPAD_DPAD_DOWN);
state[i] |= PRESSED_LEFT(x, y) ? ANDROID_GAMEPAD_DPAD_LEFT : 0; state[i] |= PRESSED_LEFT(x, y) ? ANDROID_GAMEPAD_DPAD_LEFT : 0;
state[i] |= PRESSED_RIGHT(x, y) ? ANDROID_GAMEPAD_DPAD_RIGHT : 0; state[i] |= PRESSED_RIGHT(x, y) ? ANDROID_GAMEPAD_DPAD_RIGHT : 0;
state[i] |= PRESSED_UP(x, y) ? ANDROID_GAMEPAD_DPAD_UP : 0; state[i] |= PRESSED_UP(x, y) ? ANDROID_GAMEPAD_DPAD_UP : 0;
state[i] |= PRESSED_DOWN(x, y) ? ANDROID_GAMEPAD_DPAD_DOWN : 0; state[i] |= PRESSED_DOWN(x, y) ? ANDROID_GAMEPAD_DPAD_DOWN : 0;
}
RARCH_PERFORMANCE_STOP(handle_touch);
return 1;
}
static int32_t handle_button(AInputEvent* event, int i, int keycode)
{
RARCH_PERFORMANCE_INIT(handle_button);
RARCH_PERFORMANCE_START(handle_button);
int action = AKeyEvent_getAction(event);
if(action == AKEY_EVENT_ACTION_DOWN || action == AKEY_EVENT_ACTION_MULTIPLE) if(action == AKEY_EVENT_ACTION_DOWN || action == AKEY_EVENT_ACTION_MULTIPLE)
state[i] |= keycode_lut[keycode]; state[i] |= keycode_lut[keycode];
else if(action == AKEY_EVENT_ACTION_UP)
if(action == AKEY_EVENT_ACTION_UP)
state[i] &= ~(keycode_lut[keycode]); state[i] &= ~(keycode_lut[keycode]);
if(keycode == AKEYCODE_BACK || keycode == AKEYCODE_VOLUME_UP || keycode == AKEYCODE_VOLUME_DOWN) RARCH_PERFORMANCE_STOP(handle_button);
return 0;
RARCH_PERFORMANCE_STOP(handle_input);
return 1; return 1;
} }
@ -269,11 +262,16 @@ static void setup_keycode_lut(void)
keycode_lut[AKEYCODE_S] = ANDROID_GAMEPAD_TRIANGLE; keycode_lut[AKEYCODE_S] = ANDROID_GAMEPAD_TRIANGLE;
keycode_lut[AKEYCODE_Q] = ANDROID_GAMEPAD_L1; keycode_lut[AKEYCODE_Q] = ANDROID_GAMEPAD_L1;
keycode_lut[AKEYCODE_W] = ANDROID_GAMEPAD_R1; keycode_lut[AKEYCODE_W] = ANDROID_GAMEPAD_R1;
/* Misc control scheme */
keycode_lut[AKEYCODE_BACK] = ANDROID_STATE_QUIT;
keycode_lut[AKEYCODE_VOLUME_UP] = ANDROID_STATE_VOLUME_UP;
keycode_lut[AKEYCODE_VOLUME_DOWN] = ANDROID_STATE_VOLUME_DOWN;
} }
static void setup_state_ids(void) static void setup_state_ids(void)
{ {
for(int i = 0; i < 50; i++) for(int i = 0; i < MAX_DEVICE_IDS; i++)
state_device_ids[i] = -1; state_device_ids[i] = -1;
} }
@ -281,7 +279,6 @@ static void *android_input_init(void)
{ {
pads_connected = 0; pads_connected = 0;
for(unsigned player = 0; player < 4; player++) for(unsigned player = 0; player < 4; player++)
for(unsigned i = 0; i < RARCH_FIRST_META_KEY; i++) for(unsigned i = 0; i < RARCH_FIRST_META_KEY; i++)
{ {
@ -336,7 +333,22 @@ static void android_input_poll(void *data)
if (AInputQueue_preDispatchEvent(android_app->inputQueue, event)) if (AInputQueue_preDispatchEvent(android_app->inputQueue, event))
return; return;
int32_t handled = engine_handle_input(android_app, event); int keycode = AKeyEvent_getKeyCode(event);
int32_t handled = 0;
int id = AInputEvent_getDeviceId(event);
int type = AInputEvent_getType(event);
int i = state_device_ids[id];
if(i == -1)
i = state_device_ids[id] = pads_connected++;
if(type == AINPUT_EVENT_TYPE_MOTION)
handled = handle_touch(event, i, keycode);
else if(keycode == AKEYCODE_BACK || keycode == AKEYCODE_VOLUME_UP || keycode == AKEYCODE_VOLUME_DOWN)
g_android.input_state = keycode_lut[keycode];
else
handled = handle_button(event, i, keycode);
AInputQueue_finishEvent(android_app->inputQueue, event, handled); AInputQueue_finishEvent(android_app->inputQueue, event, handled);
} }
@ -386,7 +398,7 @@ static bool android_input_key_pressed(void *data, int key)
switch (key) switch (key)
{ {
case RARCH_QUIT_KEY: case RARCH_QUIT_KEY:
if(g_android.init_quit) if(g_android.input_state & ANDROID_STATE_KILL)
return true; return true;
else else
return false; return false;

@ -22,6 +22,7 @@
#include <sys/resource.h> #include <sys/resource.h>
#include "android_general.h" #include "android_general.h"
#include "input_android.h"
#include "../../../general.h" #include "../../../general.h"
#include "../../../performance.h" #include "../../../performance.h"
@ -99,7 +100,7 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
pthread_mutex_unlock(&android_app->mutex); pthread_mutex_unlock(&android_app->mutex);
if (android_app->window != NULL) if (android_app->window != NULL)
g_android.window_inited = true; g_android.input_state = ANDROID_WINDOW_READY;
break; break;
case APP_CMD_START: case APP_CMD_START:
RARCH_LOG("engine_handle_cmd: APP_CMD_START.\n"); RARCH_LOG("engine_handle_cmd: APP_CMD_START.\n");
@ -128,7 +129,8 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
android_app->activityState = cmd; android_app->activityState = cmd;
pthread_cond_broadcast(&android_app->cond); pthread_cond_broadcast(&android_app->cond);
pthread_mutex_unlock(&android_app->mutex); pthread_mutex_unlock(&android_app->mutex);
g_android.init_quit = true; if(g_android.input_state & ANDROID_STATE_QUIT)
g_android.input_state = ANDROID_STATE_KILL;
break; break;
case APP_CMD_TERM_WINDOW: case APP_CMD_TERM_WINDOW:
RARCH_LOG("engine_handle_cmd: APP_CMD_TERM_WINDOW.\n"); RARCH_LOG("engine_handle_cmd: APP_CMD_TERM_WINDOW.\n");
@ -147,7 +149,7 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
case APP_CMD_LOST_FOCUS: case APP_CMD_LOST_FOCUS:
RARCH_LOG("engine_handle_cmd: APP_CMD_LOST_FOCUS.\n"); RARCH_LOG("engine_handle_cmd: APP_CMD_LOST_FOCUS.\n");
/* /*
if (!g_android.window_inited) if (!g_android.input_state & ANDROID_WINDOW_READY)
{ {
} }
*/ */
@ -236,7 +238,7 @@ void android_main(struct android_app* state)
g_extern.verbose = true; g_extern.verbose = true;
while(!g_android.window_inited) while(!(g_android.input_state & ANDROID_WINDOW_READY))
{ {
// Read all pending events. // Read all pending events.
int id; int id;

@ -137,7 +137,7 @@ static void gfx_ctx_check_window(bool *quit,
*resize = false; *resize = false;
// Check if we are exiting. // Check if we are exiting.
if (g_android.app->destroyRequested != 0 || g_android.init_quit) if (g_android.app->destroyRequested != 0 || (g_android.input_state & ANDROID_STATE_KILL))
*quit = true; *quit = true;
} }