diff options
author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2010-08-16 20:12:06 +0000 |
---|---|---|
committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2010-08-16 20:12:06 +0000 |
commit | 934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b (patch) | |
tree | 0aec8be568bea16b68ac87086387ba73089d931f /firmware/target/hosted/android/button-android.c | |
parent | e726e53da68d3ff53a79023d5dc5cfcc020fb864 (diff) | |
download | rockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.tar.gz rockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.zip |
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
Diffstat (limited to 'firmware/target/hosted/android/button-android.c')
-rw-r--r-- | firmware/target/hosted/android/button-android.c | 42 |
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; } |