mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-15 15:11:02 +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:
parent
6ce23c57df
commit
02f81a38c2
@ -23,8 +23,15 @@
|
||||
struct droid
|
||||
{
|
||||
struct android_app* app;
|
||||
bool init_quit;
|
||||
bool window_inited;
|
||||
uint64_t input_state;
|
||||
};
|
||||
|
||||
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;
|
||||
|
@ -49,27 +49,19 @@ enum {
|
||||
#define PRESSED_LEFT(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
|
||||
|
||||
static unsigned pads_connected;
|
||||
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 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_START(handle_input);
|
||||
|
||||
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);
|
||||
|
||||
RARCH_PERFORMANCE_INIT(handle_touch);
|
||||
RARCH_PERFORMANCE_START(handle_touch);
|
||||
#ifdef RARCH_INPUT_DEBUG
|
||||
int source = AInputEvent_getSource(event);
|
||||
|
||||
@ -94,10 +86,6 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
|
||||
}
|
||||
#endif
|
||||
|
||||
int action = AKeyEvent_getAction(event);
|
||||
|
||||
if(type == AINPUT_EVENT_TYPE_MOTION)
|
||||
{
|
||||
float x = AMotionEvent_getX(event, 0);
|
||||
float y = AMotionEvent_getY(event, 0);
|
||||
#ifdef RARCH_INPUT_DEBUG
|
||||
@ -109,19 +97,24 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
|
||||
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_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)
|
||||
state[i] |= keycode_lut[keycode];
|
||||
|
||||
if(action == AKEY_EVENT_ACTION_UP)
|
||||
else if(action == AKEY_EVENT_ACTION_UP)
|
||||
state[i] &= ~(keycode_lut[keycode]);
|
||||
|
||||
if(keycode == AKEYCODE_BACK || keycode == AKEYCODE_VOLUME_UP || keycode == AKEYCODE_VOLUME_DOWN)
|
||||
return 0;
|
||||
|
||||
RARCH_PERFORMANCE_STOP(handle_input);
|
||||
|
||||
RARCH_PERFORMANCE_STOP(handle_button);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -269,11 +262,16 @@ static void setup_keycode_lut(void)
|
||||
keycode_lut[AKEYCODE_S] = ANDROID_GAMEPAD_TRIANGLE;
|
||||
keycode_lut[AKEYCODE_Q] = ANDROID_GAMEPAD_L1;
|
||||
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)
|
||||
{
|
||||
for(int i = 0; i < 50; i++)
|
||||
for(int i = 0; i < MAX_DEVICE_IDS; i++)
|
||||
state_device_ids[i] = -1;
|
||||
}
|
||||
|
||||
@ -281,7 +279,6 @@ static void *android_input_init(void)
|
||||
{
|
||||
pads_connected = 0;
|
||||
|
||||
|
||||
for(unsigned player = 0; player < 4; player++)
|
||||
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))
|
||||
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);
|
||||
}
|
||||
@ -386,7 +398,7 @@ static bool android_input_key_pressed(void *data, int key)
|
||||
switch (key)
|
||||
{
|
||||
case RARCH_QUIT_KEY:
|
||||
if(g_android.init_quit)
|
||||
if(g_android.input_state & ANDROID_STATE_KILL)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <sys/resource.h>
|
||||
|
||||
#include "android_general.h"
|
||||
#include "input_android.h"
|
||||
#include "../../../general.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);
|
||||
|
||||
if (android_app->window != NULL)
|
||||
g_android.window_inited = true;
|
||||
g_android.input_state = ANDROID_WINDOW_READY;
|
||||
break;
|
||||
case APP_CMD_START:
|
||||
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;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
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;
|
||||
case APP_CMD_TERM_WINDOW:
|
||||
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:
|
||||
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;
|
||||
|
||||
while(!g_android.window_inited)
|
||||
while(!(g_android.input_state & ANDROID_WINDOW_READY))
|
||||
{
|
||||
// Read all pending events.
|
||||
int id;
|
||||
|
@ -137,7 +137,7 @@ static void gfx_ctx_check_window(bool *quit,
|
||||
*resize = false;
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user