summaryrefslogtreecommitdiffstats
path: root/firmware/target/hosted/android/button-android.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted/android/button-android.c')
-rw-r--r--firmware/target/hosted/android/button-android.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c
index 1172880908..50e347e714 100644
--- a/firmware/target/hosted/android/button-android.c
+++ b/firmware/target/hosted/android/button-android.c
@@ -22,12 +22,15 @@
#include <jni.h>
#include <stdbool.h>
+#include "button.h"
+#include "buttonmap.h"
#include "config.h"
#include "kernel.h"
#include "system.h"
#include "touchscreen.h"
static int last_y, last_x;
+static int last_btns;
static enum {
STATE_UNKNOWN,
@@ -35,7 +38,6 @@ static enum {
STATE_DOWN,
} last_state = STATE_UNKNOWN;
-
/*
* this writes in an interrupt-like fashion the last pixel coordinates
* that the user pressed on the screen */
@@ -64,13 +66,45 @@ Java_org_rockbox_RockboxFramebuffer_touchHandler(JNIEnv*env, jobject this,
last_state = STATE_UP;
}
+/*
+ * this writes in an interrupt-like fashion the button events that the user
+ * generated by pressing/releasing them to a variable */
+JNIEXPORT bool JNICALL
+Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jobject this,
+ int keycode, bool state)
+{
+ (void)env;
+ (void)this;
+
+ int button = key_to_button(keycode);
+
+ if (button == BUTTON_NONE)
+ return false;
+
+ if (state)
+ last_btns |= button;
+ else
+ last_btns &= ~button;
+
+ return true;
+}
+
void button_init_device(void)
{
}
int button_read_device(int *data)
{
- /* get grid button/coordinates based on the current touchscreen mode */
- int btn = touchscreen_to_pixels(last_x, last_y, data);
- return (last_state == STATE_DOWN ? btn : 0);
+ int btn = last_btns;
+ /* Get grid button/coordinates based on the current touchscreen mode
+ *
+ * Caveat: the caller seemingly depends on *data always being filled with
+ * the last known touchscreen position, so always call
+ * touchscreen_to_pixels() */
+ int touch = touchscreen_to_pixels(last_x, last_y, data);
+
+ if (last_state == STATE_DOWN)
+ btn |= touch;
+
+ return btn;
}