diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java index ca11de0..cb8b83f 100644 --- a/android/src/org/rockbox/RockboxFramebuffer.java +++ b/android/src/org/rockbox/RockboxFramebuffer.java @@ -73,6 +73,21 @@ public class RockboxFramebuffer extends View Log.d("RockboxBootloader", (String) text); } + public boolean onTrackBallEvent(MotionEvent me) + { + LOG("onTrackBallEvent"); + switch (me.getAction()) + { + case MotionEvent.ACTION_MOVE: + buttonHandler(0, (int)me.getX(), (int)me.getY()); + break; + case MotionEvent.ACTION_DOWN: + buttonHandler(1, 0, 0); + break; + } + return true; + } + public boolean onTouchEvent(MotionEvent me) { LOG("onTouchEvent"); @@ -106,4 +121,5 @@ public class RockboxFramebuffer extends View public native void set_lcd_active(int active); public native void pixelHandler(int x, int y); public native void touchHandler(int down); + public native void buttonHandler(int press, int relative_x, int relative_y); } diff --git a/firmware/target/hosted/android/app/button-target.h b/firmware/target/hosted/android/app/button-target.h index 329ed65..73149a0 100644 --- a/firmware/target/hosted/android/app/button-target.h +++ b/firmware/target/hosted/android/app/button-target.h @@ -30,27 +30,22 @@ void button_init_device(void); int button_read_device(int *data); /* Main unit's buttons */ -#define BUTTON_POWER 0x00000001 -#define BUTTON_PLUS 0x00000002 -#define BUTTON_MINUS 0x00000004 -#define BUTTON_MENU 0x00000008 - -/* Compatibility hacks for flipping. Needs a somewhat better fix. */ -#define BUTTON_LEFT BUTTON_MIDLEFT -#define BUTTON_RIGHT BUTTON_MIDRIGHT -#define BUTTON_UP BUTTON_TOPMIDDLE -#define BUTTON_DOWN BUTTON_BOTTOMMIDDLE +#define BUTTON_UP 0x00000001 +#define BUTTON_DOWN 0x00000002 +#define BUTTON_LEFT 0x00000004 +#define BUTTON_RIGHT 0x00000008 +#define BUTTON_SELECT 0x00000010 /* Touch Screen Area Buttons */ -#define BUTTON_TOPLEFT 0x00000010 -#define BUTTON_TOPMIDDLE 0x00000020 -#define BUTTON_TOPRIGHT 0x00000040 -#define BUTTON_MIDLEFT 0x00000080 -#define BUTTON_CENTER 0x00000100 -#define BUTTON_MIDRIGHT 0x00000200 -#define BUTTON_BOTTOMLEFT 0x00000400 -#define BUTTON_BOTTOMMIDDLE 0x00000800 -#define BUTTON_BOTTOMRIGHT 0x00001000 +#define BUTTON_TOPLEFT 0x00000100 +#define BUTTON_TOPMIDDLE 0x00000200 +#define BUTTON_TOPRIGHT 0x00000400 +#define BUTTON_MIDLEFT 0x00000800 +#define BUTTON_CENTER 0x00001000 +#define BUTTON_MIDRIGHT 0x00002000 +#define BUTTON_BOTTOMLEFT 0x00004000 +#define BUTTON_BOTTOMMIDDLE 0x00008000 +#define BUTTON_BOTTOMRIGHT 0x00010000 #define BUTTON_MAIN 0x1FFF diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c index 1172880..2a5b653 100644 --- a/firmware/target/hosted/android/button-android.c +++ b/firmware/target/hosted/android/button-android.c @@ -28,6 +28,7 @@ #include "touchscreen.h" static int last_y, last_x; +static int last_button; static enum { STATE_UNKNOWN, @@ -64,13 +65,42 @@ Java_org_rockbox_RockboxFramebuffer_touchHandler(JNIEnv*env, jobject this, last_state = STATE_UP; } +/* + * this notifies us in an interrupt-like fashion when a hardware button is pressed */ +JNIEXPORT void JNICALL +Java_org_rockbox_RockboxFramebuffer_butttonHandler(JNIEnv*env, jobject this, + int press, int relative_x, int relative_y) +{ + if (press) + last_button = BUTTON_SELECT; + else if (relative_y > 0) + last_button = BUTTON_UP; + else if (relative_y < 0) + last_button = BUTTON_DOWN; + else if (relative_x > 0) + last_button = BUTTON_RIGHT; + else if (relative_x < 0) + last_button = BUTTON_LEFT; +} + void button_init_device(void) { + last_button = BUTTON_NONE; } 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; + if (last_button == BUTTON_NONE) + { + /* get grid button/coordinates based on the current touchscreen mode */ + btn = touchscreen_to_pixels(last_x, last_y, data); + return (last_state == STATE_DOWN ? btn : 0); + } + else + { + btn = last_button; + last_button = BUTTON_NONE; + return btn; + } }