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 15:16:43.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; + case KEYCODE_DPAD_DOWN: + return BUTTON_DPAD_DOWN; + case KEYCODE_DPAD_LEFT: + return BUTTON_DPAD_LEFT; + case KEYCODE_DPAD_RIGHT: + return BUTTON_DPAD_RIGHT; /* is there a need to split them? I need to call them at the sametime */ 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 15:16:40.000000000 -0600 @@ -61,7 +61,7 @@ * 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, +Java_org_rockbox_RockboxFramebuffer_buttonHandler_taps(JNIEnv*env, jobject this, jint keycode, jboolean state) { (void)env; @@ -101,6 +101,46 @@ return true; } +JNIEXPORT bool JNICALL +Java_org_rockbox_RockboxFramebuffer_buttonHandler_holds(JNIEnv*env, jobject this, + jint keycode, jboolean state) +{ + (void)env; + (void)this; + + unsigned button = 0; + + if (!state) + { + button = key_to_button((int)keycode); + if (!button) + button = dpad_to_button((int)keycode); + if (button) + } + + if (!button) + { + button = key_to_button(keycode); + } + + 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) {