mirror of
https://github.com/libretro/RetroArch
synced 2025-02-21 18:40:09 +00:00
(Android) android_input_poll now only reads and processes input
events - check_window polls for system messages once
This commit is contained in:
parent
7076685a1e
commit
cf539edf91
@ -274,87 +274,63 @@ static void android_input_poll(void *data)
|
|||||||
{
|
{
|
||||||
(void)data;
|
(void)data;
|
||||||
|
|
||||||
// Read all pending events.
|
|
||||||
struct android_app* android_app = g_android.app;
|
struct android_app* android_app = g_android.app;
|
||||||
int id;
|
|
||||||
|
|
||||||
while((id = ALooper_pollOnce(0, NULL, NULL, NULL)) == ALOOPER_POLL_CALLBACK);
|
// Read all pending events.
|
||||||
|
while(AInputQueue_hasEvents(android_app->inputQueue))
|
||||||
// Process this event.
|
|
||||||
while(id >= 0)
|
|
||||||
{
|
{
|
||||||
bool looper_input_do = id == LOOPER_ID_INPUT;
|
AInputEvent* event = NULL;
|
||||||
|
AInputQueue_getEvent(android_app->inputQueue, &event);
|
||||||
|
int32_t handled = 1;
|
||||||
|
|
||||||
if(looper_input_do && AInputQueue_hasEvents(android_app->inputQueue))
|
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++;
|
||||||
|
|
||||||
|
int motion_action = AMotionEvent_getAction(event);
|
||||||
|
bool motion_do = ((motion_action == AMOTION_EVENT_ACTION_DOWN) || (motion_action ==
|
||||||
|
AMOTION_EVENT_ACTION_POINTER_DOWN) || (motion_action == AMOTION_EVENT_ACTION_MOVE));
|
||||||
|
|
||||||
|
if(type == AINPUT_EVENT_TYPE_MOTION && motion_do)
|
||||||
{
|
{
|
||||||
AInputEvent* event = NULL;
|
float x = AMotionEvent_getX(event, 0);
|
||||||
AInputQueue_getEvent(android_app->inputQueue, &event);
|
float y = AMotionEvent_getY(event, 0);
|
||||||
int32_t handled = 1;
|
|
||||||
|
|
||||||
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++;
|
|
||||||
|
|
||||||
int motion_action = AMotionEvent_getAction(event);
|
|
||||||
bool motion_do = ((motion_action == AMOTION_EVENT_ACTION_DOWN) || (motion_action ==
|
|
||||||
AMOTION_EVENT_ACTION_POINTER_DOWN) || (motion_action == AMOTION_EVENT_ACTION_MOVE));
|
|
||||||
|
|
||||||
if(type == AINPUT_EVENT_TYPE_MOTION && motion_do)
|
|
||||||
{
|
|
||||||
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] &= ~((1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) | (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT) |
|
state[i] &= ~((1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) | (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT) |
|
||||||
(1ULL << RETRO_DEVICE_ID_JOYPAD_UP) | (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN));
|
(1ULL << RETRO_DEVICE_ID_JOYPAD_UP) | (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||||
state[i] |= PRESSED_LEFT(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0;
|
state[i] |= PRESSED_LEFT(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0;
|
||||||
state[i] |= PRESSED_RIGHT(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0;
|
state[i] |= PRESSED_RIGHT(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0;
|
||||||
state[i] |= PRESSED_UP(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_UP) : 0;
|
state[i] |= PRESSED_UP(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_UP) : 0;
|
||||||
state[i] |= PRESSED_DOWN(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0;
|
state[i] |= PRESSED_DOWN(x, y) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0;
|
||||||
}
|
|
||||||
else if(type == AINPUT_EVENT_TYPE_KEY)
|
|
||||||
{
|
|
||||||
int keycode = AKeyEvent_getKeyCode(event);
|
|
||||||
uint64_t input_state = keycode_lut[keycode];
|
|
||||||
#ifdef RARCH_INPUT_DEBUG
|
|
||||||
RARCH_LOG("Keycode RetroPad %d : %d.\n", i, keycode);
|
|
||||||
#endif
|
|
||||||
if(input_state < (1ULL << RARCH_FIRST_META_KEY))
|
|
||||||
{
|
|
||||||
int action = AKeyEvent_getAction(event);
|
|
||||||
|
|
||||||
if(action == AKEY_EVENT_ACTION_DOWN)
|
|
||||||
state[i] |= input_state;
|
|
||||||
else if(action == AKEY_EVENT_ACTION_UP)
|
|
||||||
state[i] &= ~(input_state);
|
|
||||||
}
|
|
||||||
else if(input_state != -1)
|
|
||||||
{
|
|
||||||
g_extern.lifecycle_state = input_state;
|
|
||||||
handled = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AInputQueue_finishEvent(android_app->inputQueue, event, handled);
|
|
||||||
}
|
}
|
||||||
else if(!looper_input_do)
|
else
|
||||||
{
|
{
|
||||||
int8_t cmd;
|
int keycode = AKeyEvent_getKeyCode(event);
|
||||||
|
uint64_t input_state = keycode_lut[keycode];
|
||||||
if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd))
|
#ifdef RARCH_INPUT_DEBUG
|
||||||
|
RARCH_LOG("Keycode RetroPad %d : %d.\n", i, keycode);
|
||||||
|
#endif
|
||||||
|
if(input_state < (1ULL << RARCH_FIRST_META_KEY))
|
||||||
{
|
{
|
||||||
if(cmd == APP_CMD_SAVE_STATE)
|
int action = AKeyEvent_getAction(event);
|
||||||
free_saved_state(android_app);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
cmd = -1;
|
|
||||||
|
|
||||||
engine_handle_cmd(android_app, cmd);
|
if(action == AKEY_EVENT_ACTION_DOWN)
|
||||||
|
state[i] |= input_state;
|
||||||
|
else if(action == AKEY_EVENT_ACTION_UP)
|
||||||
|
state[i] &= ~(input_state);
|
||||||
|
}
|
||||||
|
else if(input_state != -1)
|
||||||
|
{
|
||||||
|
g_extern.lifecycle_state = input_state;
|
||||||
|
handled = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while((id = ALooper_pollOnce(0, NULL, NULL, NULL)) == ALOOPER_POLL_CALLBACK);
|
AInputQueue_finishEvent(android_app->inputQueue, event, handled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,9 +211,29 @@ static void gfx_ctx_check_window(bool *quit,
|
|||||||
(void)height;
|
(void)height;
|
||||||
(void)frame_count;
|
(void)frame_count;
|
||||||
|
|
||||||
|
int id;
|
||||||
|
struct android_app* android_app = g_android.app;
|
||||||
|
|
||||||
*quit = false;
|
*quit = false;
|
||||||
*resize = false;
|
*resize = false;
|
||||||
|
|
||||||
|
while((id = ALooper_pollOnce(0, NULL, NULL, NULL)) == ALOOPER_POLL_CALLBACK);
|
||||||
|
|
||||||
|
if(id == LOOPER_ID_MAIN)
|
||||||
|
{
|
||||||
|
int8_t cmd;
|
||||||
|
|
||||||
|
if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd))
|
||||||
|
{
|
||||||
|
if(cmd == APP_CMD_SAVE_STATE)
|
||||||
|
free_saved_state(android_app);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cmd = -1;
|
||||||
|
|
||||||
|
engine_handle_cmd(android_app, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
if (g_android.reinit_video)
|
if (g_android.reinit_video)
|
||||||
{
|
{
|
||||||
uninit_drivers();
|
uninit_drivers();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user