Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+413 -34
+20 -4
android/src/org/rockbox/RockboxFramebuffer.java
··· 22 22 package org.rockbox; 23 23 24 24 import java.nio.ByteBuffer; 25 + 25 26 import android.content.Context; 26 27 import android.graphics.Bitmap; 27 28 import android.graphics.Canvas; 28 29 import android.util.Log; 30 + import android.view.KeyEvent; 29 31 import android.view.MotionEvent; 30 32 import android.view.View; 31 33 32 - public class RockboxFramebuffer extends View 34 + public class RockboxFramebuffer extends View 33 35 { 34 36 private Bitmap btm; 35 37 private ByteBuffer native_buf; 36 - 37 38 38 39 public RockboxFramebuffer(Context c) 39 40 { 40 41 super(c); 41 42 btm = null; 43 + 44 + /* Needed so we can catch KeyEvents */ 45 + setFocusable(true); 46 + requestFocus(); 42 47 } 43 48 44 49 public void onDraw(Canvas c) ··· 55 60 56 61 public void java_lcd_update() 57 62 { 58 - 59 63 btm.copyPixelsFromBuffer(native_buf); 60 64 postInvalidate(); 61 65 } ··· 64 68 { 65 69 /* can't copy a partial buffer */ 66 70 btm.copyPixelsFromBuffer(native_buf); 71 + 67 72 postInvalidate(x, y, x+w, y+h); 68 73 } 69 74 ··· 90 95 pixelHandler((int)me.getX(), (int)me.getY()); 91 96 return true; 92 97 } 93 - 98 + 99 + public boolean onKeyDown(int keyCode, KeyEvent event) 100 + { 101 + return buttonHandler(keyCode, true); 102 + } 103 + 104 + public boolean onKeyUp(int keyCode, KeyEvent event) 105 + { 106 + return buttonHandler(keyCode, false); 107 + } 108 + 94 109 /* the two below should only be called from the activity thread */ 95 110 public void suspend() 96 111 { /* suspend, Rockbox will not make any lcd updates */ ··· 105 120 public native void set_lcd_active(int active); 106 121 public native void pixelHandler(int x, int y); 107 122 public native void touchHandler(int down); 123 + public native boolean buttonHandler(int keycode, boolean state); 108 124 }
+2
apps/SOURCES
··· 293 293 keymaps/keymap-vibe500.c 294 294 #elif CONFIG_KEYPAD == MPIO_HD200_PAD 295 295 keymaps/keymap-mpio-hd200.c 296 + #elif CONFIG_KEYPAD == ANDROID_PAD 297 + keymaps/keymap-android.c 296 298 #endif
+198
apps/keymaps/keymap-android.c
··· 1 + /*************************************************************************** 2 + * __________ __ ___. 3 + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 + * \/ \/ \/ \/ \/ 8 + * $Id$ 9 + * 10 + * Copyright (C) 2010 Maurus Cuelenaere 11 + * 12 + * This program is free software; you can redistribute it and/or 13 + * modify it under the terms of the GNU General Public License 14 + * as published by the Free Software Foundation; either version 2 15 + * of the License, or (at your option) any later version. 16 + * 17 + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 + * KIND, either express or implied. 19 + * 20 + ****************************************************************************/ 21 + 22 + /* Button Code Definitions for Android targets */ 23 + 24 + #include <stdio.h> 25 + #include <string.h> 26 + #include <stdlib.h> 27 + 28 + #include "config.h" 29 + #include "action.h" 30 + #include "button.h" 31 + #include "settings.h" 32 + 33 + /* 34 + * The format of the list is as follows 35 + * { Action Code, Button code, Prereq button code } 36 + * if there's no need to check the previous button's value, use BUTTON_NONE 37 + * Insert LAST_ITEM_IN_LIST at the end of each mapping 38 + */ 39 + 40 + static const struct button_mapping button_context_standard[] = { 41 + { ACTION_STD_PREV, BUTTON_DPAD_UP, BUTTON_NONE }, 42 + { ACTION_STD_PREVREPEAT, BUTTON_DPAD_UP|BUTTON_REPEAT, BUTTON_NONE }, 43 + { ACTION_STD_NEXT, BUTTON_DPAD_DOWN, BUTTON_NONE }, 44 + { ACTION_STD_NEXTREPEAT, BUTTON_DPAD_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 45 + 46 + { ACTION_STD_OK, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_DPAD_CENTER }, 47 + { ACTION_STD_OK, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_DPAD_RIGHT }, 48 + { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, 49 + { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_DPAD_LEFT }, 50 + 51 + { ACTION_STD_CONTEXT, BUTTON_MENU, BUTTON_NONE }, 52 + 53 + LAST_ITEM_IN_LIST 54 + }; /* button_context_standard */ 55 + 56 + static const struct button_mapping button_context_wps[] = { 57 + { ACTION_WPS_BROWSE, BUTTON_BACK, BUTTON_NONE }, 58 + { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 59 + { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 60 + 61 + LAST_ITEM_IN_LIST 62 + }; /* button_context_wps */ 63 + 64 + static const struct button_mapping button_context_list[] = { 65 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 66 + }; /* button_context_list */ 67 + 68 + static const struct button_mapping button_context_tree[] = { 69 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 70 + }; /* button_context_tree */ 71 + 72 + static const struct button_mapping button_context_listtree_scroll_with_combo[] = { 73 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), 74 + }; 75 + 76 + static const struct button_mapping button_context_listtree_scroll_without_combo[] = { 77 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE), 78 + }; 79 + 80 + static const struct button_mapping button_context_settings[] = { 81 + { ACTION_SETTINGS_INC, BUTTON_DPAD_RIGHT, BUTTON_NONE }, 82 + { ACTION_SETTINGS_INCREPEAT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 83 + { ACTION_SETTINGS_DEC, BUTTON_DPAD_LEFT, BUTTON_NONE }, 84 + { ACTION_SETTINGS_DECREPEAT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 85 + { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, 86 + { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, 87 + 88 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 89 + }; /* button_context_settings */ 90 + 91 + static const struct button_mapping button_context_settings_right_is_inc[] = { 92 + 93 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 94 + }; /* button_context_settingsgraphical */ 95 + 96 + static const struct button_mapping button_context_yesno[] = { 97 + { ACTION_YESNO_ACCEPT, BUTTON_DPAD_CENTER, BUTTON_NONE }, 98 + 99 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 100 + }; /* button_context_settings_yesno */ 101 + 102 + static const struct button_mapping button_context_colorchooser[] = { 103 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), 104 + }; /* button_context_colorchooser */ 105 + 106 + static const struct button_mapping button_context_eq[] = { 107 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), 108 + }; /* button_context_eq */ 109 + 110 + /** Bookmark Screen **/ 111 + static const struct button_mapping button_context_bmark[] = { 112 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 113 + }; /* button_context_bmark */ 114 + 115 + static const struct button_mapping button_context_time[] = { 116 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), 117 + }; /* button_context_time */ 118 + 119 + static const struct button_mapping button_context_quickscreen[] = { 120 + { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, 121 + 122 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 123 + }; /* button_context_quickscreen */ 124 + 125 + static const struct button_mapping button_context_pitchscreen[] = { 126 + 127 + { ACTION_PS_INC_SMALL, BUTTON_DPAD_RIGHT, BUTTON_NONE }, 128 + { ACTION_PS_INC_BIG, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 129 + { ACTION_PS_DEC_SMALL, BUTTON_DPAD_LEFT, BUTTON_NONE }, 130 + { ACTION_PS_DEC_BIG, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 131 + { ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE }, 132 + 133 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 134 + }; /* button_context_pitchcreen */ 135 + 136 + static const struct button_mapping button_context_keyboard[] = { 137 + { ACTION_KBD_PAGE_FLIP, BUTTON_MENU, BUTTON_NONE }, 138 + { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT, BUTTON_NONE }, 139 + { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 140 + { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT, BUTTON_NONE }, 141 + { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 142 + 143 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 144 + }; /* button_context_keyboard */ 145 + 146 + static const struct button_mapping button_context_radio[] = { 147 + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) 148 + }; /* button_context_radio */ 149 + 150 + const struct button_mapping* target_get_context_mapping(int context) 151 + { 152 + switch (context) 153 + { 154 + case CONTEXT_STD: 155 + return button_context_standard; 156 + case CONTEXT_WPS: 157 + return button_context_wps; 158 + 159 + case CONTEXT_LIST: 160 + return button_context_list; 161 + case CONTEXT_MAINMENU: 162 + case CONTEXT_TREE: 163 + if (global_settings.hold_lr_for_scroll_in_list) 164 + return button_context_listtree_scroll_without_combo; 165 + else 166 + return button_context_listtree_scroll_with_combo; 167 + case CONTEXT_CUSTOM|CONTEXT_TREE: 168 + return button_context_tree; 169 + 170 + case CONTEXT_SETTINGS: 171 + return button_context_settings; 172 + case CONTEXT_CUSTOM|CONTEXT_SETTINGS: 173 + case CONTEXT_SETTINGS_RECTRIGGER: 174 + return button_context_settings_right_is_inc; 175 + 176 + case CONTEXT_SETTINGS_COLOURCHOOSER: 177 + return button_context_colorchooser; 178 + case CONTEXT_SETTINGS_EQ: 179 + return button_context_eq; 180 + 181 + case CONTEXT_SETTINGS_TIME: 182 + return button_context_time; 183 + 184 + case CONTEXT_YESNOSCREEN: 185 + return button_context_yesno; 186 + case CONTEXT_FM: 187 + return button_context_radio; 188 + case CONTEXT_BOOKMARKSCREEN: 189 + return button_context_bmark; 190 + case CONTEXT_QUICKSCREEN: 191 + return button_context_quickscreen; 192 + case CONTEXT_PITCHSCREEN: 193 + return button_context_pitchscreen; 194 + case CONTEXT_KEYBOARD: 195 + return button_context_keyboard; 196 + } 197 + return button_context_standard; 198 + }
+3
firmware/SOURCES
··· 1708 1708 target/hosted/android/kernel-android.c 1709 1709 target/hosted/android/pcm-android.c 1710 1710 target/hosted/android/system-android.c 1711 + #ifdef APPLICATION 1712 + target/hosted/android/app/button-application.c 1713 + #endif 1711 1714 drivers/audio/android.c 1712 1715 thread.c 1713 1716 #endif
+1
firmware/export/config.h
··· 128 128 #define PHILIPS_HDD6330_PAD 42 129 129 #define PBELL_VIBE500_PAD 43 130 130 #define MPIO_HD200_PAD 44 131 + #define ANDROID_PAD 45 131 132 132 133 /* CONFIG_REMOTE_KEYPAD */ 133 134 #define H100_REMOTE 1
+4
firmware/export/config/application.h
··· 75 75 /* Define this if you do software codec */ 76 76 #define CONFIG_CODEC SWCODEC 77 77 78 + #ifdef ANDROID 79 + #define CONFIG_KEYPAD ANDROID_PAD 80 + #else 78 81 #define CONFIG_KEYPAD COWON_D2_PAD 82 + #endif 79 83 80 84 #if (CONFIG_PLATFORM & PLATFORM_SDL) 81 85 /* Use SDL audio/pcm in a SDL app build */
+97
firmware/target/hosted/android/app/android_keyevents.h
··· 1 + /* Ripped from http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob_plain;f=core/java/android/view/KeyEvent.java;hb=HEAD */ 2 + #define KEYCODE_UNKNOWN 0 3 + #define KEYCODE_SOFT_LEFT 1 4 + #define KEYCODE_SOFT_RIGHT 2 5 + #define KEYCODE_HOME 3 6 + #define KEYCODE_BACK 4 7 + #define KEYCODE_CALL 5 8 + #define KEYCODE_ENDCALL 6 9 + #define KEYCODE_0 7 10 + #define KEYCODE_1 8 11 + #define KEYCODE_2 9 12 + #define KEYCODE_3 10 13 + #define KEYCODE_4 11 14 + #define KEYCODE_5 12 15 + #define KEYCODE_6 13 16 + #define KEYCODE_7 14 17 + #define KEYCODE_8 15 18 + #define KEYCODE_9 16 19 + #define KEYCODE_STAR 17 20 + #define KEYCODE_POUND 18 21 + #define KEYCODE_DPAD_UP 19 22 + #define KEYCODE_DPAD_DOWN 20 23 + #define KEYCODE_DPAD_LEFT 21 24 + #define KEYCODE_DPAD_RIGHT 22 25 + #define KEYCODE_DPAD_CENTER 23 26 + #define KEYCODE_VOLUME_UP 24 27 + #define KEYCODE_VOLUME_DOWN 25 28 + #define KEYCODE_POWER 26 29 + #define KEYCODE_CAMERA 27 30 + #define KEYCODE_CLEAR 28 31 + #define KEYCODE_A 29 32 + #define KEYCODE_B 30 33 + #define KEYCODE_C 31 34 + #define KEYCODE_D 32 35 + #define KEYCODE_E 33 36 + #define KEYCODE_F 34 37 + #define KEYCODE_G 35 38 + #define KEYCODE_H 36 39 + #define KEYCODE_I 37 40 + #define KEYCODE_J 38 41 + #define KEYCODE_K 39 42 + #define KEYCODE_L 40 43 + #define KEYCODE_M 41 44 + #define KEYCODE_N 42 45 + #define KEYCODE_O 43 46 + #define KEYCODE_P 44 47 + #define KEYCODE_Q 45 48 + #define KEYCODE_R 46 49 + #define KEYCODE_S 47 50 + #define KEYCODE_T 48 51 + #define KEYCODE_U 49 52 + #define KEYCODE_V 50 53 + #define KEYCODE_W 51 54 + #define KEYCODE_X 52 55 + #define KEYCODE_Y 53 56 + #define KEYCODE_Z 54 57 + #define KEYCODE_COMMA 55 58 + #define KEYCODE_PERIOD 56 59 + #define KEYCODE_ALT_LEFT 57 60 + #define KEYCODE_ALT_RIGHT 58 61 + #define KEYCODE_SHIFT_LEFT 59 62 + #define KEYCODE_SHIFT_RIGHT 60 63 + #define KEYCODE_TAB 61 64 + #define KEYCODE_SPACE 62 65 + #define KEYCODE_SYM 63 66 + #define KEYCODE_EXPLORER 64 67 + #define KEYCODE_ENVELOPE 65 68 + #define KEYCODE_ENTER 66 69 + #define KEYCODE_DEL 67 70 + #define KEYCODE_GRAVE 68 71 + #define KEYCODE_MINUS 69 72 + #define KEYCODE_EQUALS 70 73 + #define KEYCODE_LEFT_BRACKET 71 74 + #define KEYCODE_RIGHT_BRACKET 72 75 + #define KEYCODE_BACKSLASH 73 76 + #define KEYCODE_SEMICOLON 74 77 + #define KEYCODE_APOSTROPHE 75 78 + #define KEYCODE_SLASH 76 79 + #define KEYCODE_AT 77 80 + #define KEYCODE_NUM 78 81 + #define KEYCODE_HEADSETHOOK 79 82 + #define KEYCODE_FOCUS 80 83 + #define KEYCODE_PLUS 81 84 + #define KEYCODE_MENU 82 85 + #define KEYCODE_NOTIFICATION 83 86 + #define KEYCODE_SEARCH 84 87 + #define KEYCODE_MEDIA_PLAY_PAUSE 85 88 + #define KEYCODE_MEDIA_STOP 86 89 + #define KEYCODE_MEDIA_NEXT 87 90 + #define KEYCODE_MEDIA_PREVIOUS 88 91 + #define KEYCODE_MEDIA_REWIND 89 92 + #define KEYCODE_MEDIA_FAST_FORWARD 90 93 + #define KEYCODE_MUTE 91 94 + #define KEYCODE_PAGE_UP 92 95 + #define KEYCODE_PAGE_DOWN 93 96 + #define KEYCODE_PICTSYMBOLS 94 97 + #define KEYCODE_SWITCH_CHARSET 95
+9
firmware/target/hosted/android/app/android_keyevents.sh
··· 1 + #!/bin/sh 2 + # Simple script that converts Android's KEYCODE_* ints to preprocessor #defines 3 + 4 + URL="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob_plain;f=core/java/android/view/KeyEvent.java;hb=HEAD" 5 + 6 + echo "Processing $URL..." 7 + (echo "/* Ripped from $URL */"; 8 + curl $URL | grep "public static final int KEYCODE" | sed 's/^.*public static final int \(KEYCODE_.*\) *= *\([0-9]*\).*$/#define \1 \2/' 9 + ) > `dirname $0`/android_keyevents.h
+21 -3
firmware/target/hosted/android/app/button-application.c
··· 17 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 18 * KIND, either express or implied. 19 19 * 20 - ***************************************************9*************************/ 20 + *****************************************************************************/ 21 21 22 22 23 23 #include "button.h" 24 + #include "android_keyevents.h" 24 25 25 26 int key_to_button(int keyboard_key) 26 27 { 27 - (void)keyboard_key; 28 - return BUTTON_NONE; 28 + switch (keyboard_key) 29 + { 30 + default: 31 + return BUTTON_NONE; 32 + case KEYCODE_BACK: 33 + return BUTTON_BACK; 34 + case KEYCODE_DPAD_UP: 35 + return BUTTON_DPAD_UP; 36 + case KEYCODE_DPAD_DOWN: 37 + return BUTTON_DPAD_DOWN; 38 + case KEYCODE_DPAD_LEFT: 39 + return BUTTON_DPAD_LEFT; 40 + case KEYCODE_DPAD_RIGHT: 41 + return BUTTON_DPAD_RIGHT; 42 + case KEYCODE_DPAD_CENTER: 43 + return BUTTON_DPAD_CENTER; 44 + case KEYCODE_MENU: 45 + return BUTTON_MENU; 46 + } 29 47 }
+20 -23
firmware/target/hosted/android/app/button-target.h
··· 30 30 int button_read_device(int *data); 31 31 32 32 /* Main unit's buttons */ 33 - #define BUTTON_POWER 0x00000001 34 - #define BUTTON_PLUS 0x00000002 35 - #define BUTTON_MINUS 0x00000004 36 - #define BUTTON_MENU 0x00000008 33 + #define BUTTON_MENU 0x00000001 34 + #define BUTTON_BACK 0x00000002 35 + #define BUTTON_DPAD_LEFT 0x00000004 36 + #define BUTTON_DPAD_RIGHT 0x00000008 37 + #define BUTTON_DPAD_UP 0x00000010 38 + #define BUTTON_DPAD_DOWN 0x00000020 39 + #define BUTTON_DPAD_CENTER 0x00000040 37 40 38 41 /* Compatibility hacks for flipping. Needs a somewhat better fix. */ 39 - #define BUTTON_LEFT BUTTON_MIDLEFT 40 - #define BUTTON_RIGHT BUTTON_MIDRIGHT 41 - #define BUTTON_UP BUTTON_TOPMIDDLE 42 - #define BUTTON_DOWN BUTTON_BOTTOMMIDDLE 42 + #define BUTTON_LEFT BUTTON_DPAD_LEFT 43 + #define BUTTON_RIGHT BUTTON_DPAD_RIGHT 44 + #define BUTTON_UP BUTTON_DPAD_UP 45 + #define BUTTON_DOWN BUTTON_DPAD_DOWN 43 46 44 47 /* Touch Screen Area Buttons */ 45 - #define BUTTON_TOPLEFT 0x00000010 46 - #define BUTTON_TOPMIDDLE 0x00000020 47 - #define BUTTON_TOPRIGHT 0x00000040 48 - #define BUTTON_MIDLEFT 0x00000080 49 - #define BUTTON_CENTER 0x00000100 50 - #define BUTTON_MIDRIGHT 0x00000200 51 - #define BUTTON_BOTTOMLEFT 0x00000400 52 - #define BUTTON_BOTTOMMIDDLE 0x00000800 53 - #define BUTTON_BOTTOMRIGHT 0x00001000 54 - 55 - #define BUTTON_MAIN 0x1FFF 48 + #define BUTTON_TOPLEFT 0x00001000 49 + #define BUTTON_TOPMIDDLE 0x00002000 50 + #define BUTTON_TOPRIGHT 0x00004000 51 + #define BUTTON_MIDLEFT 0x00008000 52 + #define BUTTON_CENTER 0x00010000 53 + #define BUTTON_MIDRIGHT 0x00020000 54 + #define BUTTON_BOTTOMLEFT 0x00040000 55 + #define BUTTON_BOTTOMMIDDLE 0x00080000 56 + #define BUTTON_BOTTOMRIGHT 0x00100000 56 57 57 58 /* No remote */ 58 59 #define BUTTON_REMOTE 0 59 - 60 - /* Software power-off */ 61 - #define POWEROFF_BUTTON BUTTON_POWER 62 - #define POWEROFF_COUNT 10 63 60 64 61 #endif /* _BUTTON_TARGET_H_ */
+38 -4
firmware/target/hosted/android/button-android.c
··· 22 22 23 23 #include <jni.h> 24 24 #include <stdbool.h> 25 + #include "button.h" 26 + #include "buttonmap.h" 25 27 #include "config.h" 26 28 #include "kernel.h" 27 29 #include "system.h" 28 30 #include "touchscreen.h" 29 31 30 32 static int last_y, last_x; 33 + static int last_btns; 31 34 32 35 static enum { 33 36 STATE_UNKNOWN, 34 37 STATE_UP, 35 38 STATE_DOWN, 36 39 } last_state = STATE_UNKNOWN; 37 - 38 40 39 41 /* 40 42 * this writes in an interrupt-like fashion the last pixel coordinates ··· 64 66 last_state = STATE_UP; 65 67 } 66 68 69 + /* 70 + * this writes in an interrupt-like fashion the button events that the user 71 + * generated by pressing/releasing them to a variable */ 72 + JNIEXPORT bool JNICALL 73 + Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jobject this, 74 + int keycode, bool state) 75 + { 76 + (void)env; 77 + (void)this; 78 + 79 + int button = key_to_button(keycode); 80 + 81 + if (button == BUTTON_NONE) 82 + return false; 83 + 84 + if (state) 85 + last_btns |= button; 86 + else 87 + last_btns &= ~button; 88 + 89 + return true; 90 + } 91 + 67 92 void button_init_device(void) 68 93 { 69 94 } 70 95 71 96 int button_read_device(int *data) 72 97 { 73 - /* get grid button/coordinates based on the current touchscreen mode */ 74 - int btn = touchscreen_to_pixels(last_x, last_y, data); 75 - return (last_state == STATE_DOWN ? btn : 0); 98 + int btn = last_btns; 99 + /* Get grid button/coordinates based on the current touchscreen mode 100 + * 101 + * Caveat: the caller seemingly depends on *data always being filled with 102 + * the last known touchscreen position, so always call 103 + * touchscreen_to_pixels() */ 104 + int touch = touchscreen_to_pixels(last_x, last_y, data); 105 + 106 + if (last_state == STATE_DOWN) 107 + btn |= touch; 108 + 109 + return btn; 76 110 }