diff -Naur ./rockbox/android/src/org/rockbox/RockboxFramebuffer.java ./rockbox.fixes/android/src/org/rockbox/RockboxFramebuffer.java --- ./rockbox/android/src/org/rockbox/RockboxFramebuffer.java 2011-01-24 02:40:43.000000000 -0600 +++ ./rockbox.fixes/android/src/org/rockbox/RockboxFramebuffer.java 2011-01-25 12:38:27.000000000 -0600 @@ -102,12 +102,17 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { + return buttonHandler(4, true); + } + event.startTracking(); return buttonHandler(keyCode, true); } public boolean onKeyUp(int keyCode, KeyEvent event) { - return buttonHandler(keyCode, false); + event.startTracking(); + return false; } public void destroy() diff -Naur ./rockbox/firmware/target/hosted/android/app/button-application.c ./rockbox.fixes/firmware/target/hosted/android/app/button-application.c --- ./rockbox/firmware/target/hosted/android/app/button-application.c 2011-01-24 02:41:27.000000000 -0600 +++ ./rockbox.fixes/firmware/target/hosted/android/app/button-application.c 2011-01-25 12:40:05.000000000 -0600 @@ -39,15 +39,14 @@ return BUTTON_MENU; case KEYCODE_DPAD_CENTER: return BUTTON_DPAD_CENTER; - default: - return BUTTON_NONE; - } -} - -unsigned multimedia_to_button(int keyboard_key) -{ - switch (keyboard_key) - { + case KEYCODE_DPAD_UP: + return BUTTON_DPAD_UP|BUTTON_REL; + case KEYCODE_DPAD_DOWN: + return BUTTON_DPAD_DOWN|BUTTON_REL; + case KEYCODE_DPAD_LEFT: + return BUTTON_DPAD_LEFT|BUTTON_REL; + case KEYCODE_DPAD_RIGHT: + return BUTTON_DPAD_RIGHT|BUTTON_REL; case KEYCODE_MEDIA_PLAY_PAUSE: return BUTTON_MULTIMEDIA_PLAYPAUSE; case KEYCODE_MEDIA_STOP: @@ -61,28 +60,6 @@ case KEYCODE_MEDIA_FAST_FORWARD: return BUTTON_MULTIMEDIA_FFWD; default: - return 0; - } -} - -unsigned dpad_to_button(int keyboard_key) -{ - switch (keyboard_key) - { - /* These buttons only post a single release event. - * doing otherwise will cause action.c to lock up waiting for - * a release (because android sends press/unpress to us too quickly - */ - case KEYCODE_DPAD_UP: - return BUTTON_DPAD_UP|BUTTON_REL; - case KEYCODE_DPAD_DOWN: - return BUTTON_DPAD_DOWN|BUTTON_REL; - case KEYCODE_DPAD_LEFT: - return BUTTON_DPAD_LEFT|BUTTON_REL; - case KEYCODE_DPAD_RIGHT: - return BUTTON_DPAD_RIGHT|BUTTON_REL; - default: return BUTTON_NONE; } -} - +} diff -Naur ./rockbox/firmware/target/hosted/android/button-android.c ./rockbox.fixes/firmware/target/hosted/android/button-android.c --- ./rockbox/firmware/target/hosted/android/button-android.c 2011-01-24 02:41:27.000000000 -0600 +++ ./rockbox.fixes/firmware/target/hosted/android/button-android.c 2011-01-25 12:38:34.000000000 -0600 @@ -71,11 +71,9 @@ if (!state) { - button = multimedia_to_button((int)keycode); + button = key_to_button((int)keycode); if (!button) - button = dpad_to_button((int)keycode); - if (button) - queue_post(&button_queue, button, 0); + button = key_to_button((int)keycode); } if (!button) @@ -86,22 +84,15 @@ if (button == BUTTON_NONE) { last_btns = button; - return false; - } - - if (state) - { - last_btns |= button; - } - else - { last_btns &= (~button); return false; } - + + queue_post(&button_queue, button, 0); return true; } + void button_init_device(void) { }