aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core.c60
-rw-r--r--src/physac.c2
-rw-r--r--src/physac.h2
-rw-r--r--src/raylib.h11
4 files changed, 68 insertions, 7 deletions
diff --git a/src/core.c b/src/core.c
index c07f2f86..1d05edc6 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,35 @@ Vector2 GetTouchPosition(void)
return position;
}
+
+// Detect if a button has been pressed once
+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 +1686,22 @@ static int32_t AndroidInputCallback(struct android_app *app, AInputEvent *event)
{
int32_t keycode = AKeyEvent_getKeyCode(event);
//int32_t AKeyEvent_getMetaState(event);
+
+ // Save current button and its state
+ 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)
+ {
+ // Let the OS handle input to avoid app stuck. Behaviour: CMD_PAUSE -> CMD_SAVE_STATE -> CMD_STOP -> CMD_CONFIG_CHANGED -> CMD_LOST_FOCUS
+ // Resuming Behaviour: CMD_START -> CMD_RESUME -> CMD_CONFIG_CHANGED -> CMD_CONFIG_CHANGED -> CMD_GAINED_FOCUS
+ // It seems like locking mobile, screen size (CMD_CONFIG_CHANGED) is affected.
+ // NOTE: AndroidManifest.xml must have <activity android:configChanges="orientation|keyboardHidden|screenSize" >
+ // Before that change, activity was calling CMD_TERM_WINDOW and CMD_DESTROY when locking mobile, so that was not a normal behaviour
+ return 0;
+ }
+ else 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 +1826,7 @@ static void PollInputEvents(void)
// TODO: Remove this requirement...
UpdateGestures();
+
#endif
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
@@ -1806,6 +1855,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/physac.c b/src/physac.c
index 73ce7adc..6e3b6e61 100644
--- a/src/physac.c
+++ b/src/physac.c
@@ -61,7 +61,7 @@ static Vector2 Vector2Normalize(Vector2 vector);
//----------------------------------------------------------------------------------
// Module Functions Definitions
//----------------------------------------------------------------------------------
-void InitPhysics()
+void InitPhysics(void)
{
for (int i = 0; i < MAX_ELEMENTS; i++)
{
diff --git a/src/physac.h b/src/physac.h
index 7dbfe1fe..558673ef 100644
--- a/src/physac.h
+++ b/src/physac.h
@@ -76,7 +76,7 @@ extern "C" { // Prevents name mangling of functions
//----------------------------------------------------------------------------------
// Module Functions Declarations
//----------------------------------------------------------------------------------
-void InitPhysics(); // Initialize all internal physics values
+void InitPhysics(void); // Initialize all internal physics values
void SetPhysics(Physics settings); // Set physics settings values using Physics data type to overwrite internal physics settings
void AddRigidbody(int index, Rigidbody rigidbody); // Initialize a new rigidbody with parameters to internal index slot
diff --git a/src/raylib.h b/src/raylib.h
index f1203537..72211b59 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)
@@ -796,7 +805,7 @@ void SetMaterialNormalDepth(Material *material, float depth); // Set n
//----------------------------------------------------------------------------------
// Physics System Functions (engine-module: physics)
//----------------------------------------------------------------------------------
-void InitPhysics(); // Initialize all internal physics values
+void InitPhysics(void); // Initialize all internal physics values
void SetPhysics(Physics settings); // Set physics settings values using Physics data type to overwrite internal physics settings
void AddRigidbody(int index, Rigidbody rigidbody); // Initialize a new rigidbody with parameters to internal index slot