From ea500923565f66326e0ace470184374f158781d8 Mon Sep 17 00:00:00 2001 From: victorfisac Date: Mon, 4 Jan 2016 21:00:20 +0100 Subject: [PATCH] Add Android physic buttons input detection - Added functions for detect when pressed, during down and when released. - Added defines for back, menu, volume up and down button numbers. --- src/core.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- src/raylib.h | 9 +++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/core.c b/src/core.c index 06260281..6a470240 100644 --- a/src/core.c +++ b/src/core.c @@ -122,6 +122,8 @@ static int ident, events; static bool windowReady = false; // Used to detect display initialization static bool appEnabled = true; // Used to detec if app is active static bool contextRebindRequired = false; // Used to know context rebind required +static int previousButtonState[512] = { 1 }; // Required to check if button pressed/released once +static int currentButtonState[512] = { 1 }; // Required to check if button pressed/released once #elif defined(PLATFORM_RPI) static EGL_DISPMANX_WINDOW_T nativeWindow; // Native window (graphic device) @@ -365,6 +367,13 @@ void InitWindow(int width, int height, struct android_app *state) TraceLog(INFO, "Android app initialized successfully"); + // Init button states values (default up) + for(int i = 0; i < 512; i++) + { + currentButtonState[i] = 1; + previousButtonState[i] = 1; + } + // Wait for window to be initialized (display and context) while (!windowReady) { @@ -1101,6 +1110,34 @@ Vector2 GetTouchPosition(void) return position; } + +bool IsButtonPressed(int button) +{ + bool pressed = false; + + if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 0)) pressed = true; + else pressed = false; + + return pressed; +} + +// Detect if a button is being pressed (button held down) +bool IsButtonDown(int button) +{ + if (currentButtonState[button] == 0) return true; + else return false; +} + +// Detect if a button has been released once +bool IsButtonReleased(int button) +{ + bool released = false; + + if ((currentButtonState[button] != previousButtonState[button]) && (currentButtonState[button] == 1)) released = true; + else released = false; + + return released; +} #endif //---------------------------------------------------------------------------------- @@ -1648,12 +1685,14 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event) { int32_t keycode = AKeyEvent_getKeyCode(event); //int32_t AKeyEvent_getMetaState(event); + + currentButtonState[keycode] = AKeyEvent_getAction (event); // Down = 0, Up = 1 //if (keycode == AKEYCODE_HOME) { } - //if (keycode == AKEYCODE_POWER) { } - if (keycode == AKEYCODE_BACK) + if (keycode == AKEYCODE_POWER) { return 1; } + if ((keycode == AKEYCODE_BACK) || (keycode == AKEYCODE_MENU)) { - // Eat BACK_BUTTON, just do nothing... and don't let to be handled by OS! + // Eat BACK_BUTTON and AKEYCODE_MENU, just do nothing... and don't let to be handled by OS! return 1; } else if ((keycode == AKEYCODE_VOLUME_UP) || (keycode == AKEYCODE_VOLUME_DOWN)) @@ -1778,6 +1817,7 @@ static void PollInputEvents(void) // TODO: Remove this requirement... UpdateGestures(); + #endif #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) @@ -1806,6 +1846,9 @@ static void PollInputEvents(void) glfwPollEvents(); // Register keyboard/mouse events... and window events! #elif defined(PLATFORM_ANDROID) + // Register previous keys states + for (int i = 0; i < 512; i++) previousButtonState[i] = currentButtonState[i]; + // Poll Events (registered events) // NOTE: Activity is paused if not enabled (appEnabled) while ((ident = ALooper_pollAll(appEnabled ? 0 : -1, NULL, &events,(void**)&source)) >= 0) diff --git a/src/raylib.h b/src/raylib.h index f1203537..641eac4b 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -186,6 +186,12 @@ // TODO: Review Xbox360 USB Controller Buttons +// Android Physic Buttons +#define ANDROID_BACK 4 +#define ANDROID_MENU 82 +#define ANDROID_VOLUME_UP 24 +#define ANDROID_VOLUME_DOWN 25 + // Some Basic Colors // NOTE: Custom raylib color palette for amazing visuals on WHITE background #define LIGHTGRAY (Color){ 200, 200, 200, 255 } // Light Gray @@ -581,6 +587,9 @@ bool IsGamepadButtonUp(int gamepad, int button); // Detect if a gamepad b int GetTouchX(void); // Returns touch position X (relative to screen size) int GetTouchY(void); // Returns touch position Y (relative to screen size) Vector2 GetTouchPosition(void); // Returns touch position XY (relative to screen size) +bool IsButtonPressed(int button); // Detect if an android physic button has been pressed +bool IsButtonDown(int button); // Detect if an android physic button is being pressed +bool IsButtonReleased(int button); // Detect if an android physic button has been released //------------------------------------------------------------------------------------ // Gestures and Touch Handling Functions (Module: gestures)