diff options
author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2010-08-16 20:12:06 +0000 |
---|---|---|
committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2010-08-16 20:12:06 +0000 |
commit | 934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b (patch) | |
tree | 0aec8be568bea16b68ac87086387ba73089d931f | |
parent | e726e53da68d3ff53a79023d5dc5cfcc020fb864 (diff) | |
download | rockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.tar.gz rockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.zip |
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
-rw-r--r-- | android/src/org/rockbox/RockboxFramebuffer.java | 24 | ||||
-rw-r--r-- | apps/SOURCES | 2 | ||||
-rw-r--r-- | apps/keymaps/keymap-android.c | 198 | ||||
-rw-r--r-- | firmware/SOURCES | 3 | ||||
-rw-r--r-- | firmware/export/config.h | 1 | ||||
-rw-r--r-- | firmware/export/config/application.h | 4 | ||||
-rw-r--r-- | firmware/target/hosted/android/app/android_keyevents.h | 97 | ||||
-rwxr-xr-x | firmware/target/hosted/android/app/android_keyevents.sh | 9 | ||||
-rw-r--r-- | firmware/target/hosted/android/app/button-application.c | 24 | ||||
-rw-r--r-- | firmware/target/hosted/android/app/button-target.h | 43 | ||||
-rw-r--r-- | firmware/target/hosted/android/button-android.c | 42 |
11 files changed, 413 insertions, 34 deletions
diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java index 32fbfef111..1734b4fab1 100644 --- a/android/src/org/rockbox/RockboxFramebuffer.java +++ b/android/src/org/rockbox/RockboxFramebuffer.java | |||
@@ -22,23 +22,28 @@ | |||
22 | package org.rockbox; | 22 | package org.rockbox; |
23 | 23 | ||
24 | import java.nio.ByteBuffer; | 24 | import java.nio.ByteBuffer; |
25 | |||
25 | import android.content.Context; | 26 | import android.content.Context; |
26 | import android.graphics.Bitmap; | 27 | import android.graphics.Bitmap; |
27 | import android.graphics.Canvas; | 28 | import android.graphics.Canvas; |
28 | import android.util.Log; | 29 | import android.util.Log; |
30 | import android.view.KeyEvent; | ||
29 | import android.view.MotionEvent; | 31 | import android.view.MotionEvent; |
30 | import android.view.View; | 32 | import android.view.View; |
31 | 33 | ||
32 | public class RockboxFramebuffer extends View | 34 | public class RockboxFramebuffer extends View |
33 | { | 35 | { |
34 | private Bitmap btm; | 36 | private Bitmap btm; |
35 | private ByteBuffer native_buf; | 37 | private ByteBuffer native_buf; |
36 | 38 | ||
37 | |||
38 | public RockboxFramebuffer(Context c) | 39 | public RockboxFramebuffer(Context c) |
39 | { | 40 | { |
40 | super(c); | 41 | super(c); |
41 | btm = null; | 42 | btm = null; |
43 | |||
44 | /* Needed so we can catch KeyEvents */ | ||
45 | setFocusable(true); | ||
46 | requestFocus(); | ||
42 | } | 47 | } |
43 | 48 | ||
44 | public void onDraw(Canvas c) | 49 | public void onDraw(Canvas c) |
@@ -55,7 +60,6 @@ public class RockboxFramebuffer extends View | |||
55 | 60 | ||
56 | public void java_lcd_update() | 61 | public void java_lcd_update() |
57 | { | 62 | { |
58 | |||
59 | btm.copyPixelsFromBuffer(native_buf); | 63 | btm.copyPixelsFromBuffer(native_buf); |
60 | postInvalidate(); | 64 | postInvalidate(); |
61 | } | 65 | } |
@@ -64,6 +68,7 @@ public class RockboxFramebuffer extends View | |||
64 | { | 68 | { |
65 | /* can't copy a partial buffer */ | 69 | /* can't copy a partial buffer */ |
66 | btm.copyPixelsFromBuffer(native_buf); | 70 | btm.copyPixelsFromBuffer(native_buf); |
71 | |||
67 | postInvalidate(x, y, x+w, y+h); | 72 | postInvalidate(x, y, x+w, y+h); |
68 | } | 73 | } |
69 | 74 | ||
@@ -90,7 +95,17 @@ public class RockboxFramebuffer extends View | |||
90 | pixelHandler((int)me.getX(), (int)me.getY()); | 95 | pixelHandler((int)me.getX(), (int)me.getY()); |
91 | return true; | 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 | /* the two below should only be called from the activity thread */ | 109 | /* the two below should only be called from the activity thread */ |
95 | public void suspend() | 110 | public void suspend() |
96 | { /* suspend, Rockbox will not make any lcd updates */ | 111 | { /* suspend, Rockbox will not make any lcd updates */ |
@@ -105,4 +120,5 @@ public class RockboxFramebuffer extends View | |||
105 | public native void set_lcd_active(int active); | 120 | public native void set_lcd_active(int active); |
106 | public native void pixelHandler(int x, int y); | 121 | public native void pixelHandler(int x, int y); |
107 | public native void touchHandler(int down); | 122 | public native void touchHandler(int down); |
123 | public native boolean buttonHandler(int keycode, boolean state); | ||
108 | } | 124 | } |
diff --git a/apps/SOURCES b/apps/SOURCES index d15ba5bf6a..a00239428c 100644 --- a/apps/SOURCES +++ b/apps/SOURCES | |||
@@ -293,4 +293,6 @@ keymaps/keymap-mini2440.c | |||
293 | keymaps/keymap-vibe500.c | 293 | keymaps/keymap-vibe500.c |
294 | #elif CONFIG_KEYPAD == MPIO_HD200_PAD | 294 | #elif CONFIG_KEYPAD == MPIO_HD200_PAD |
295 | keymaps/keymap-mpio-hd200.c | 295 | keymaps/keymap-mpio-hd200.c |
296 | #elif CONFIG_KEYPAD == ANDROID_PAD | ||
297 | keymaps/keymap-android.c | ||
296 | #endif | 298 | #endif |
diff --git a/apps/keymaps/keymap-android.c b/apps/keymaps/keymap-android.c new file mode 100644 index 0000000000..cbc20c3e67 --- /dev/null +++ b/apps/keymaps/keymap-android.c | |||
@@ -0,0 +1,198 @@ | |||
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 | } | ||
diff --git a/firmware/SOURCES b/firmware/SOURCES index f27a7dd140..19e51ac948 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES | |||
@@ -1708,6 +1708,9 @@ target/hosted/android/button-android.c | |||
1708 | target/hosted/android/kernel-android.c | 1708 | target/hosted/android/kernel-android.c |
1709 | target/hosted/android/pcm-android.c | 1709 | target/hosted/android/pcm-android.c |
1710 | target/hosted/android/system-android.c | 1710 | target/hosted/android/system-android.c |
1711 | #ifdef APPLICATION | ||
1712 | target/hosted/android/app/button-application.c | ||
1713 | #endif | ||
1711 | drivers/audio/android.c | 1714 | drivers/audio/android.c |
1712 | thread.c | 1715 | thread.c |
1713 | #endif | 1716 | #endif |
diff --git a/firmware/export/config.h b/firmware/export/config.h index 3b59004549..409c9d9965 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h | |||
@@ -128,6 +128,7 @@ | |||
128 | #define PHILIPS_HDD6330_PAD 42 | 128 | #define PHILIPS_HDD6330_PAD 42 |
129 | #define PBELL_VIBE500_PAD 43 | 129 | #define PBELL_VIBE500_PAD 43 |
130 | #define MPIO_HD200_PAD 44 | 130 | #define MPIO_HD200_PAD 44 |
131 | #define ANDROID_PAD 45 | ||
131 | 132 | ||
132 | /* CONFIG_REMOTE_KEYPAD */ | 133 | /* CONFIG_REMOTE_KEYPAD */ |
133 | #define H100_REMOTE 1 | 134 | #define H100_REMOTE 1 |
diff --git a/firmware/export/config/application.h b/firmware/export/config/application.h index 71ee62356b..6a87d5f62a 100644 --- a/firmware/export/config/application.h +++ b/firmware/export/config/application.h | |||
@@ -75,7 +75,11 @@ | |||
75 | /* Define this if you do software codec */ | 75 | /* Define this if you do software codec */ |
76 | #define CONFIG_CODEC SWCODEC | 76 | #define CONFIG_CODEC SWCODEC |
77 | 77 | ||
78 | #ifdef ANDROID | ||
79 | #define CONFIG_KEYPAD ANDROID_PAD | ||
80 | #else | ||
78 | #define CONFIG_KEYPAD COWON_D2_PAD | 81 | #define CONFIG_KEYPAD COWON_D2_PAD |
82 | #endif | ||
79 | 83 | ||
80 | #if (CONFIG_PLATFORM & PLATFORM_SDL) | 84 | #if (CONFIG_PLATFORM & PLATFORM_SDL) |
81 | /* Use SDL audio/pcm in a SDL app build */ | 85 | /* Use SDL audio/pcm in a SDL app build */ |
diff --git a/firmware/target/hosted/android/app/android_keyevents.h b/firmware/target/hosted/android/app/android_keyevents.h new file mode 100644 index 0000000000..82c525f396 --- /dev/null +++ b/firmware/target/hosted/android/app/android_keyevents.h | |||
@@ -0,0 +1,97 @@ | |||
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 | ||
diff --git a/firmware/target/hosted/android/app/android_keyevents.sh b/firmware/target/hosted/android/app/android_keyevents.sh new file mode 100755 index 0000000000..cd654ad01e --- /dev/null +++ b/firmware/target/hosted/android/app/android_keyevents.sh | |||
@@ -0,0 +1,9 @@ | |||
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 | ||
diff --git a/firmware/target/hosted/android/app/button-application.c b/firmware/target/hosted/android/app/button-application.c index a27f769718..47798a6096 100644 --- a/firmware/target/hosted/android/app/button-application.c +++ b/firmware/target/hosted/android/app/button-application.c | |||
@@ -17,13 +17,31 @@ | |||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | 17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
18 | * KIND, either express or implied. | 18 | * KIND, either express or implied. |
19 | * | 19 | * |
20 | ***************************************************9*************************/ | 20 | *****************************************************************************/ |
21 | 21 | ||
22 | 22 | ||
23 | #include "button.h" | 23 | #include "button.h" |
24 | #include "android_keyevents.h" | ||
24 | 25 | ||
25 | int key_to_button(int keyboard_key) | 26 | int key_to_button(int keyboard_key) |
26 | { | 27 | { |
27 | (void)keyboard_key; | 28 | switch (keyboard_key) |
28 | return BUTTON_NONE; | 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 | } |
diff --git a/firmware/target/hosted/android/app/button-target.h b/firmware/target/hosted/android/app/button-target.h index 329ed651af..6c7bd271e9 100644 --- a/firmware/target/hosted/android/app/button-target.h +++ b/firmware/target/hosted/android/app/button-target.h | |||
@@ -30,35 +30,32 @@ void button_init_device(void); | |||
30 | int button_read_device(int *data); | 30 | int button_read_device(int *data); |
31 | 31 | ||
32 | /* Main unit's buttons */ | 32 | /* Main unit's buttons */ |
33 | #define BUTTON_POWER 0x00000001 | 33 | #define BUTTON_MENU 0x00000001 |
34 | #define BUTTON_PLUS 0x00000002 | 34 | #define BUTTON_BACK 0x00000002 |
35 | #define BUTTON_MINUS 0x00000004 | 35 | #define BUTTON_DPAD_LEFT 0x00000004 |
36 | #define BUTTON_MENU 0x00000008 | 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 | /* Compatibility hacks for flipping. Needs a somewhat better fix. */ | 41 | /* Compatibility hacks for flipping. Needs a somewhat better fix. */ |
39 | #define BUTTON_LEFT BUTTON_MIDLEFT | 42 | #define BUTTON_LEFT BUTTON_DPAD_LEFT |
40 | #define BUTTON_RIGHT BUTTON_MIDRIGHT | 43 | #define BUTTON_RIGHT BUTTON_DPAD_RIGHT |
41 | #define BUTTON_UP BUTTON_TOPMIDDLE | 44 | #define BUTTON_UP BUTTON_DPAD_UP |
42 | #define BUTTON_DOWN BUTTON_BOTTOMMIDDLE | 45 | #define BUTTON_DOWN BUTTON_DPAD_DOWN |
43 | 46 | ||
44 | /* Touch Screen Area Buttons */ | 47 | /* Touch Screen Area Buttons */ |
45 | #define BUTTON_TOPLEFT 0x00000010 | 48 | #define BUTTON_TOPLEFT 0x00001000 |
46 | #define BUTTON_TOPMIDDLE 0x00000020 | 49 | #define BUTTON_TOPMIDDLE 0x00002000 |
47 | #define BUTTON_TOPRIGHT 0x00000040 | 50 | #define BUTTON_TOPRIGHT 0x00004000 |
48 | #define BUTTON_MIDLEFT 0x00000080 | 51 | #define BUTTON_MIDLEFT 0x00008000 |
49 | #define BUTTON_CENTER 0x00000100 | 52 | #define BUTTON_CENTER 0x00010000 |
50 | #define BUTTON_MIDRIGHT 0x00000200 | 53 | #define BUTTON_MIDRIGHT 0x00020000 |
51 | #define BUTTON_BOTTOMLEFT 0x00000400 | 54 | #define BUTTON_BOTTOMLEFT 0x00040000 |
52 | #define BUTTON_BOTTOMMIDDLE 0x00000800 | 55 | #define BUTTON_BOTTOMMIDDLE 0x00080000 |
53 | #define BUTTON_BOTTOMRIGHT 0x00001000 | 56 | #define BUTTON_BOTTOMRIGHT 0x00100000 |
54 | |||
55 | #define BUTTON_MAIN 0x1FFF | ||
56 | 57 | ||
57 | /* No remote */ | 58 | /* No remote */ |
58 | #define BUTTON_REMOTE 0 | 59 | #define BUTTON_REMOTE 0 |
59 | |||
60 | /* Software power-off */ | ||
61 | #define POWEROFF_BUTTON BUTTON_POWER | ||
62 | #define POWEROFF_COUNT 10 | ||
63 | 60 | ||
64 | #endif /* _BUTTON_TARGET_H_ */ | 61 | #endif /* _BUTTON_TARGET_H_ */ |
diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c index 1172880908..50e347e714 100644 --- a/firmware/target/hosted/android/button-android.c +++ b/firmware/target/hosted/android/button-android.c | |||
@@ -22,12 +22,15 @@ | |||
22 | 22 | ||
23 | #include <jni.h> | 23 | #include <jni.h> |
24 | #include <stdbool.h> | 24 | #include <stdbool.h> |
25 | #include "button.h" | ||
26 | #include "buttonmap.h" | ||
25 | #include "config.h" | 27 | #include "config.h" |
26 | #include "kernel.h" | 28 | #include "kernel.h" |
27 | #include "system.h" | 29 | #include "system.h" |
28 | #include "touchscreen.h" | 30 | #include "touchscreen.h" |
29 | 31 | ||
30 | static int last_y, last_x; | 32 | static int last_y, last_x; |
33 | static int last_btns; | ||
31 | 34 | ||
32 | static enum { | 35 | static enum { |
33 | STATE_UNKNOWN, | 36 | STATE_UNKNOWN, |
@@ -35,7 +38,6 @@ static enum { | |||
35 | STATE_DOWN, | 38 | STATE_DOWN, |
36 | } last_state = STATE_UNKNOWN; | 39 | } last_state = STATE_UNKNOWN; |
37 | 40 | ||
38 | |||
39 | /* | 41 | /* |
40 | * this writes in an interrupt-like fashion the last pixel coordinates | 42 | * this writes in an interrupt-like fashion the last pixel coordinates |
41 | * that the user pressed on the screen */ | 43 | * that the user pressed on the screen */ |
@@ -64,13 +66,45 @@ Java_org_rockbox_RockboxFramebuffer_touchHandler(JNIEnv*env, jobject this, | |||
64 | last_state = STATE_UP; | 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 | void button_init_device(void) | 92 | void button_init_device(void) |
68 | { | 93 | { |
69 | } | 94 | } |
70 | 95 | ||
71 | int button_read_device(int *data) | 96 | int button_read_device(int *data) |
72 | { | 97 | { |
73 | /* get grid button/coordinates based on the current touchscreen mode */ | 98 | int btn = last_btns; |
74 | int btn = touchscreen_to_pixels(last_x, last_y, data); | 99 | /* Get grid button/coordinates based on the current touchscreen mode |
75 | return (last_state == STATE_DOWN ? btn : 0); | 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 | } |