diff -Naur rockbox.svn/android/src/org/rockbox/Helper/MediaButtonReceiver.java rockbox.fixes/android/src/org/rockbox/Helper/MediaButtonReceiver.java --- rockbox.svn/android/src/org/rockbox/Helper/MediaButtonReceiver.java 2011-02-03 13:12:48.000000000 -0600 +++ rockbox.fixes/android/src/org/rockbox/Helper/MediaButtonReceiver.java 2011-02-06 23:17:33.000000000 -0600 @@ -80,11 +80,7 @@ if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent key = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); - if (key.getAction() == KeyEvent.ACTION_UP) - { /* pass the pressed key to Rockbox */ - if (RockboxService.get_instance().get_fb().dispatchKeyEvent(key)) - abortBroadcast(); - } + RockboxService.get_instance().get_fb().dispatchKeyEvent(key); } } } diff -Naur rockbox.svn/android/src/org/rockbox/RockboxActivity.java rockbox.fixes/android/src/org/rockbox/RockboxActivity.java --- rockbox.svn/android/src/org/rockbox/RockboxActivity.java 2011-02-03 13:12:49.000000000 -0600 +++ rockbox.fixes/android/src/org/rockbox/RockboxActivity.java 2011-02-07 00:16:13.000000000 -0600 @@ -31,6 +31,7 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.view.MotionEvent; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; @@ -158,4 +159,12 @@ { Log.d("Rockbox", (String) text); } + + @Override + public boolean onTrackballEvent(MotionEvent event) + { + RockboxService.get_instance().get_fb().dispatchTrackballEvent(event); + return false; /* Trap: toggle true to eat all center buttons */ + } + } diff -Naur rockbox.svn/android/src/org/rockbox/RockboxFramebuffer.java rockbox.fixes/android/src/org/rockbox/RockboxFramebuffer.java --- rockbox.svn/android/src/org/rockbox/RockboxFramebuffer.java 2011-02-03 13:12:49.000000000 -0600 +++ rockbox.fixes/android/src/org/rockbox/RockboxFramebuffer.java 2011-02-07 00:21:02.000000000 -0600 @@ -100,6 +100,19 @@ return false; } + public boolean onTrackballEvent(MotionEvent event) + { + int x = (int) event.getX(); + int y = (int) event.getY(); + + switch (event.getAction()) + { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_MOVE: + } + return false; /* Trap: toggle true to eat all center buttons */ + } + public boolean onKeyDown(int keyCode, KeyEvent event) { return buttonHandler(keyCode, true); @@ -148,4 +161,5 @@ private native void set_lcd_active(int active); private native void touchHandler(boolean down, int x, int y); private native static boolean buttonHandler(int keycode, boolean state); + private native void trackHandler(int x, int y); } diff -Naur rockbox.svn/android/src/org/rockbox/RockboxService.java rockbox.fixes/android/src/org/rockbox/RockboxService.java --- rockbox.svn/android/src/org/rockbox/RockboxService.java 2011-02-03 13:12:49.000000000 -0600 +++ rockbox.fixes/android/src/org/rockbox/RockboxService.java 2011-02-06 23:58:15.000000000 -0600 @@ -89,6 +89,7 @@ { return fb; } + /* framebuffer is initialised by the native code(!) so this is needed */ public void set_fb(RockboxFramebuffer newfb) { @@ -102,6 +103,7 @@ { return current_activity; } + public void set_activity(Activity a) { current_activity = a; @@ -122,22 +124,22 @@ if (intent.getAction().equals("org.rockbox.PlayPause")) { if (fb != null) - fb.onKeyUp(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, null); + fb.onKeyDown(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, null); } else if (intent.getAction().equals("org.rockbox.Prev")) { if (fb != null) - fb.onKeyUp(KeyEvent.KEYCODE_MEDIA_PREVIOUS, null); + fb.onKeyDown(KeyEvent.KEYCODE_MEDIA_PREVIOUS, null); } else if (intent.getAction().equals("org.rockbox.Next")) { if (fb != null) - fb.onKeyUp(KeyEvent.KEYCODE_MEDIA_NEXT, null); + fb.onKeyDown(KeyEvent.KEYCODE_MEDIA_NEXT, null); } else if (intent.getAction().equals("org.rockbox.Stop")) { if (fb != null) - fb.onKeyUp(KeyEvent.KEYCODE_MEDIA_STOP, null); + fb.onKeyDown(KeyEvent.KEYCODE_MEDIA_STOP, null); } } diff -Naur rockbox.svn/apps/keymaps/keymap-android.c rockbox.fixes/apps/keymaps/keymap-android.c --- rockbox.svn/apps/keymaps/keymap-android.c 2011-02-03 13:13:09.000000000 -0600 +++ rockbox.fixes/apps/keymaps/keymap-android.c 2011-02-06 23:17:33.000000000 -0600 @@ -41,11 +41,11 @@ { ACTION_STD_PREV, BUTTON_DPAD_UP|BUTTON_REL, BUTTON_NONE }, { ACTION_STD_NEXT, BUTTON_DPAD_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_NONE }, { ACTION_STD_OK, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REPEAT, BUTTON_BACK }, - { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, { ACTION_STD_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, @@ -54,7 +54,7 @@ }; /* button_context_standard */ static const struct button_mapping button_context_wps[] = { - { ACTION_WPS_BROWSE, BUTTON_BACK, BUTTON_NONE }, + { ACTION_WPS_BROWSE, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, @@ -80,8 +80,8 @@ static const struct button_mapping button_context_settings[] = { { ACTION_SETTINGS_INC, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_NONE }, { ACTION_SETTINGS_DEC, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settings */ @@ -92,7 +92,7 @@ }; /* button_context_settingsgraphical */ static const struct button_mapping button_context_yesno[] = { - { ACTION_YESNO_ACCEPT, BUTTON_DPAD_CENTER, BUTTON_NONE }, + { ACTION_YESNO_ACCEPT, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settings_yesno */ diff -Naur rockbox.svn/firmware/target/hosted/android/app/button-application.c rockbox.fixes/firmware/target/hosted/android/app/button-application.c --- rockbox.svn/firmware/target/hosted/android/app/button-application.c 2011-02-03 13:13:14.000000000 -0600 +++ rockbox.fixes/firmware/target/hosted/android/app/button-application.c 2011-02-06 23:17:33.000000000 -0600 @@ -29,7 +29,7 @@ ignore_back_button = yes; } -int key_to_button(int keyboard_key) +int keycode_to_button(int keyboard_key) { switch (keyboard_key) { @@ -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; case KEYCODE_MEDIA_PLAY_PAUSE: return BUTTON_MULTIMEDIA_PLAYPAUSE; case KEYCODE_MEDIA_STOP: @@ -64,25 +63,4 @@ 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.svn/firmware/target/hosted/android/app/button-target.h rockbox.fixes/firmware/target/hosted/android/app/button-target.h --- rockbox.svn/firmware/target/hosted/android/app/button-target.h 2011-02-03 13:13:14.000000000 -0600 +++ rockbox.fixes/firmware/target/hosted/android/app/button-target.h 2011-02-07 00:00:26.000000000 -0600 @@ -28,8 +28,7 @@ #undef button_init_device void button_init_device(void); int button_read_device(int *data); -unsigned multimedia_to_button(int keyboard_key); -unsigned dpad_to_button(int keyboard_key); +int keycode_to_button(int keycode); void android_ignore_back_button(bool yes); /* Main unit's buttons */ diff -Naur rockbox.svn/firmware/target/hosted/android/button-android.c rockbox.fixes/firmware/target/hosted/android/button-android.c --- rockbox.svn/firmware/target/hosted/android/button-android.c 2011-02-03 13:13:14.000000000 -0600 +++ rockbox.fixes/firmware/target/hosted/android/button-android.c 2011-02-07 00:24:34.000000000 -0600 @@ -69,37 +69,29 @@ unsigned button = 0; - if (!state) - { - button = multimedia_to_button((int)keycode); - if (!button) - button = dpad_to_button((int)keycode); - if (button) - queue_post(&button_queue, button, 0); - } - - if (!button) - { - button = key_to_button(keycode); - } - - if (button == BUTTON_NONE) + if (state) { + button = keycode_to_button((int)keycode); + if (button == 0) return false; + if (button == BUTTON_NONE) + { + last_btns = 0; + return false; + } + queue_post(&button_queue, button, 0); last_btns = button; - return false; + return true; } - if (state) - { - last_btns |= button; - } - else + if (!state) { - last_btns &= (~button); - return false; + queue_post(&button_queue, BUTTON_REL, 0); + last_btns = 0; + return true; } - - return true; + + return false; + } void button_init_device(void) @@ -121,3 +113,18 @@ return btn; } + +/* + * this notifies us in an interrupt-like fashion whether the user just + * began or stopped the track action */ +JNIEXPORT void JNICALL +Java_org_rockbox_RockboxFramebuffer_trackHandler(JNIEnv*env, jobject this, + jint x, jint y) +{ + (void)env; + (void)this; + + x = 0; /* suppress a warning for now */ + y = 0; + +} +