From 934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Mon, 16 Aug 2010 20:12:06 +0000 Subject: Android port: add support for hardware keys * Forward Java KeyEvents to C layer and translate them to Rockbox BUTTON_*. * Add a basic Android keymap git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27832 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/hosted/android/button-android.c | 42 ++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) (limited to 'firmware/target/hosted/android/button-android.c') 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 #include +#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; } -- cgit v1.2.3