summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/SOURCES3
-rw-r--r--apps/action.h53
-rw-r--r--apps/keymaps/keymap-c100.c61
-rw-r--r--apps/keymaps/keymap-c200.c67
-rw-r--r--apps/keymaps/keymap-clip.c67
-rw-r--r--apps/keymaps/keymap-e200.c67
-rw-r--r--apps/keymaps/keymap-gigabeat-s.c107
-rw-r--r--apps/keymaps/keymap-h10.c47
-rw-r--r--apps/keymaps/keymap-hdd1630.c71
-rw-r--r--apps/keymaps/keymap-ipod.c75
-rw-r--r--apps/keymaps/keymap-mr100.c6
-rw-r--r--apps/keymaps/keymap-ondavx747.c16
-rw-r--r--apps/keymaps/keymap-ondavx777.c4
-rw-r--r--apps/keymaps/keymap-sa9200.c80
-rw-r--r--apps/keymaps/keymap-touchscreen.c27
-rw-r--r--apps/lang/english.lang70
-rw-r--r--apps/menus/settings_menu.c6
-rw-r--r--apps/plugin.c4
-rw-r--r--apps/plugin.h4
-rw-r--r--apps/plugins/SOURCES2
-rw-r--r--apps/screens.c177
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c7
-rw-r--r--apps/usb_keymaps.c249
-rw-r--r--apps/usb_keymaps.h28
25 files changed, 1045 insertions, 259 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 0408c32583..bac376589a 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -150,6 +150,9 @@ dsp_arm.S
150eq_arm.S 150eq_arm.S
151#endif 151#endif
152#endif 152#endif
153#ifdef USB_ENABLE_HID
154usb_keymaps.c
155#endif
153metadata.c 156metadata.c
154metadata/mp3.c 157metadata/mp3.c
155#if CONFIG_CODEC == SWCODEC 158#if CONFIG_CODEC == SWCODEC
diff --git a/apps/action.h b/apps/action.h
index 5df8639cdf..39e3e09d73 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -76,6 +76,7 @@ enum {
76 CONTEXT_KEYBOARD, 76 CONTEXT_KEYBOARD,
77 CONTEXT_FM, 77 CONTEXT_FM,
78 CONTEXT_USB_HID, 78 CONTEXT_USB_HID,
79 CONTEXT_USB_HID_MOUSE,
79}; 80};
80 81
81 82
@@ -241,14 +242,52 @@ enum {
241#endif 242#endif
242 243
243 /* USB HID codes */ 244 /* USB HID codes */
244 ACTION_USB_HID_PLAY, 245 ACTION_USB_HID_FIRST, /* Place holder */
245 ACTION_USB_HID_STOP, 246 ACTION_USB_HID_DEC,
246 ACTION_USB_HID_SKIPPREV, 247 ACTION_USB_HID_INC,
247 ACTION_USB_HID_SKIPNEXT, 248 ACTION_USB_HID_START,
248 ACTION_USB_HID_VOLDOWN, 249 ACTION_USB_HID_START_LONG,
249 ACTION_USB_HID_VOLUP, 250 ACTION_USB_HID_QUIT,
250 ACTION_USB_HID_MUTE, 251 ACTION_USB_HID_QUIT_LONG,
252 ACTION_USB_HID_LEFT,
253 ACTION_USB_HID_LEFT_LONG,
254 ACTION_USB_HID_RIGHT,
255 ACTION_USB_HID_RIGHT_LONG,
256 ACTION_USB_HID_SELECT,
257 ACTION_USB_HID_SELECT_LONG,
251 ACTION_USB_HID_MENU, 258 ACTION_USB_HID_MENU,
259 ACTION_USB_HID_MENU_LONG,
260 ACTION_USB_HID_MODE,
261 ACTION_USB_HID_MODE_LONG,
262 ACTION_USB_HID_MOUSE_UP,
263 ACTION_USB_HID_MOUSE_UP_REP,
264 ACTION_USB_HID_MOUSE_DOWN,
265 ACTION_USB_HID_MOUSE_DOWN_REP,
266 ACTION_USB_HID_MOUSE_LEFT,
267 ACTION_USB_HID_MOUSE_LEFT_REP,
268 ACTION_USB_HID_MOUSE_RIGHT,
269 ACTION_USB_HID_MOUSE_RIGHT_REP,
270 ACTION_USB_HID_MOUSE_LDRAG_UP,
271 ACTION_USB_HID_MOUSE_LDRAG_UP_REP,
272 ACTION_USB_HID_MOUSE_LDRAG_DOWN,
273 ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP,
274 ACTION_USB_HID_MOUSE_LDRAG_LEFT,
275 ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP,
276 ACTION_USB_HID_MOUSE_LDRAG_RIGHT,
277 ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP,
278 ACTION_USB_HID_MOUSE_RDRAG_UP,
279 ACTION_USB_HID_MOUSE_RDRAG_UP_REP,
280 ACTION_USB_HID_MOUSE_RDRAG_DOWN,
281 ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP,
282 ACTION_USB_HID_MOUSE_RDRAG_LEFT,
283 ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP,
284 ACTION_USB_HID_MOUSE_RDRAG_RIGHT,
285 ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP,
286 ACTION_USB_HID_MOUSE_BUTTON_LEFT,
287 ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL,
288 ACTION_USB_HID_MOUSE_BUTTON_RIGHT,
289 ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL,
290 ACTION_USB_HID_LAST, /* Place holder */
252 291
253 LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */ 292 LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */
254}; 293};
diff --git a/apps/keymaps/keymap-c100.c b/apps/keymaps/keymap-c100.c
index a19549dbd9..fcb747b5fd 100644
--- a/apps/keymaps/keymap-c100.c
+++ b/apps/keymaps/keymap-c100.c
@@ -232,17 +232,60 @@ static const struct button_mapping button_context_bmark[] = {
232 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 232 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
233}; /* button_context_bmark */ 233}; /* button_context_bmark */
234 234
235#ifdef HAVE_USBSTACK 235#ifdef USB_ENABLE_HID
236static const struct button_mapping button_context_usb_hid[] = { 236static const struct button_mapping button_context_usb_hid[] = {
237 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 237 { ACTION_USB_HID_INC, BUTTON_VOLUP, BUTTON_NONE },
238 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 238 { ACTION_USB_HID_INC, BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_NONE },
239 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 239 { ACTION_USB_HID_DEC, BUTTON_VOLDOWN, BUTTON_NONE },
240 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 240 { ACTION_USB_HID_DEC, BUTTON_VOLDOWN|BUTTON_REPEAT, BUTTON_NONE },
241 { ACTION_USB_HID_MUTE, BUTTON_VOLDOWN, BUTTON_NONE }, 241 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
242 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 242 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
243 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
244 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
245 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
246 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
247 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
248 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
249 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
250 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
251 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
252 { ACTION_USB_HID_MODE, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
243 253
244 LAST_ITEM_IN_LIST 254 LAST_ITEM_IN_LIST
245}; /* button_context_usb_hid */ 255}; /* button_context_usb_hid */
256
257static const struct button_mapping button_context_usb_hid_mouse[] = {
258 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
259 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
260 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
261 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
262 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
263 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
264 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
265 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
266 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
267 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
268 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
269 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
270 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
271 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
272 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
273 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
274 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
275 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
276 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
277 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
278 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
279 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
280 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
281 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
283 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
284 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
285 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
286
287 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
288}; /* button_context_usb_hid_mouse */
246#endif 289#endif
247 290
248/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 291/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -293,9 +336,11 @@ const struct button_mapping* get_context_mapping(int context)
293#endif 336#endif
294 case CONTEXT_KEYBOARD: 337 case CONTEXT_KEYBOARD:
295 return button_context_keyboard; 338 return button_context_keyboard;
296#ifdef HAVE_USBSTACK 339#ifdef USB_ENABLE_HID
297 case CONTEXT_USB_HID: 340 case CONTEXT_USB_HID:
298 return button_context_usb_hid; 341 return button_context_usb_hid;
342 case CONTEXT_USB_HID_MOUSE:
343 return button_context_usb_hid_mouse;
299#endif 344#endif
300 default: 345 default:
301 return button_context_standard; 346 return button_context_standard;
diff --git a/apps/keymaps/keymap-c200.c b/apps/keymaps/keymap-c200.c
index acc4a6aaf0..fa6c64cec8 100644
--- a/apps/keymaps/keymap-c200.c
+++ b/apps/keymaps/keymap-c200.c
@@ -264,21 +264,62 @@ static const struct button_mapping button_context_bmark[] = {
264 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 264 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
265}; /* button_context_bmark */ 265}; /* button_context_bmark */
266 266
267#ifdef HAVE_USBSTACK 267#ifdef USB_ENABLE_HID
268static const struct button_mapping button_context_usb_hid[] = { 268static const struct button_mapping button_context_usb_hid[] = {
269 { ACTION_USB_HID_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, 269 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
270 { ACTION_USB_HID_STOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, 270 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
271 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 271 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
272 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 272 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
273 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 273 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
274 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 274 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
275 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 275 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
276 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 276 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
277 { ACTION_USB_HID_MUTE, BUTTON_DOWN, BUTTON_NONE }, 277 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
278 { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, 278 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
279 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
280 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
281 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
282 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
283 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
284 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
285 { ACTION_USB_HID_MODE, BUTTON_REC|BUTTON_REL, BUTTON_REC },
286 { ACTION_USB_HID_MODE_LONG, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
279 287
280 LAST_ITEM_IN_LIST 288 LAST_ITEM_IN_LIST
281}; /* button_context_usb_hid */ 289}; /* button_context_usb_hid */
290
291static const struct button_mapping button_context_usb_hid_mouse[] = {
292 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
293 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
294 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
295 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
296 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
297 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
298 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
299 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
300 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
301 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
302 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
303 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
320
321 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
322}; /* button_context_usb_hid_mouse */
282#endif 323#endif
283 324
284/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 325/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -327,9 +368,11 @@ const struct button_mapping* get_context_mapping(int context)
327#endif 368#endif
328 case CONTEXT_KEYBOARD: 369 case CONTEXT_KEYBOARD:
329 return button_context_keyboard; 370 return button_context_keyboard;
330#ifdef HAVE_USBSTACK 371#ifdef USB_ENABLE_HID
331 case CONTEXT_USB_HID: 372 case CONTEXT_USB_HID:
332 return button_context_usb_hid; 373 return button_context_usb_hid;
374 case CONTEXT_USB_HID_MOUSE:
375 return button_context_usb_hid_mouse;
333#endif 376#endif
334 default: 377 default:
335 return button_context_standard; 378 return button_context_standard;
diff --git a/apps/keymaps/keymap-clip.c b/apps/keymaps/keymap-clip.c
index 5b45f4fb3d..21728db7fb 100644
--- a/apps/keymaps/keymap-clip.c
+++ b/apps/keymaps/keymap-clip.c
@@ -273,21 +273,62 @@ static const struct button_mapping button_context_bmark[] = {
273 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 273 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
274}; /* button_context_bmark */ 274}; /* button_context_bmark */
275 275
276#ifdef HAVE_USBSTACK 276#ifdef USB_ENABLE_HID
277static const struct button_mapping button_context_usb_hid[] = { 277static const struct button_mapping button_context_usb_hid[] = {
278 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 278 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
279 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 279 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
280 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 280 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
281 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 281 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 282 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
283 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 283 { ACTION_USB_HID_START_LONG, BUTTON_UP|BOTTOM_REPEAT, BUTTON_UP },
284 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 284 { ACTION_USB_HID_QUIT, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
285 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 285 { ACTION_USB_HID_QUIT_LONG, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
286 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 286 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
287 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 287 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
288 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
289 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
290 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
291 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
292 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
293 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
294 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
295 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
288 296
289 LAST_ITEM_IN_LIST 297 LAST_ITEM_IN_LIST
290}; /* button_context_usb_hid */ 298}; /* button_context_usb_hid */
299
300static const struct button_mapping button_context_usb_hid_mouse[] = {
301 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
302 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
303 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_HOME|BUTTON_UP, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_HOME|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_HOME|BUTTON_DOWN, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_HOME|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_HOME|BUTTON_LEFT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_HOME|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_HOME|BUTTON_RIGHT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_HOME|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_HOME, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_HOME|BUTTON_REL, BUTTON_NONE },
329
330 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
331}; /* button_context_usb_hid_mouse */
291#endif 332#endif
292 333
293/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 334/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -337,9 +378,11 @@ const struct button_mapping* get_context_mapping(int context)
337#endif 378#endif
338 case CONTEXT_KEYBOARD: 379 case CONTEXT_KEYBOARD:
339 return button_context_keyboard; 380 return button_context_keyboard;
340#ifdef HAVE_USBSTACK 381#ifdef USB_ENABLE_HID
341 case CONTEXT_USB_HID: 382 case CONTEXT_USB_HID:
342 return button_context_usb_hid; 383 return button_context_usb_hid;
384 case CONTEXT_USB_HID_MOUSE:
385 return button_context_usb_hid_mouse;
343#endif 386#endif
344 default: 387 default:
345 return button_context_standard; 388 return button_context_standard;
diff --git a/apps/keymaps/keymap-e200.c b/apps/keymaps/keymap-e200.c
index ede06515ef..ef5c932f20 100644
--- a/apps/keymaps/keymap-e200.c
+++ b/apps/keymaps/keymap-e200.c
@@ -275,21 +275,62 @@ static const struct button_mapping button_context_bmark[] = {
275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
276}; /* button_context_bmark */ 276}; /* button_context_bmark */
277 277
278#ifdef HAVE_USBSTACK 278#ifdef USB_ENABLE_HID
279static const struct button_mapping button_context_usb_hid[] = { 279static const struct button_mapping button_context_usb_hid[] = {
280 { ACTION_USB_HID_PLAY, BUTTON_UP, BUTTON_NONE }, 280 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD, BUTTON_NONE },
281 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 281 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE },
282 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 282 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE },
283 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 283 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE },
284 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, 284 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
285 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, 285 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
286 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, 286 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
287 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, 287 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
288 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 288 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
289 { ACTION_USB_HID_MENU, BUTTON_DOWN, BUTTON_NONE }, 289 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
290 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
291 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
292 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
293 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
294 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
295 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
296 { ACTION_USB_HID_MODE, BUTTON_REC|BUTTON_REL, BUTTON_REC },
297 { ACTION_USB_HID_MODE_LONG, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
290 298
291 LAST_ITEM_IN_LIST 299 LAST_ITEM_IN_LIST
292}; /* button_context_usb_hid */ 300}; /* button_context_usb_hid */
301
302static const struct button_mapping button_context_usb_hid_mouse[] = {
303 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
304 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
305 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
306 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
307 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
308 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
331
332 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
333}; /* button_context_usb_hid_mouse */
293#endif 334#endif
294 335
295/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 336/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
@@ -339,9 +380,11 @@ const struct button_mapping* get_context_mapping(int context)
339 return button_context_recscreen; 380 return button_context_recscreen;
340 case CONTEXT_KEYBOARD: 381 case CONTEXT_KEYBOARD:
341 return button_context_keyboard; 382 return button_context_keyboard;
342#ifdef HAVE_USBSTACK 383#ifdef USB_ENABLE_HID
343 case CONTEXT_USB_HID: 384 case CONTEXT_USB_HID:
344 return button_context_usb_hid; 385 return button_context_usb_hid;
386 case CONTEXT_USB_HID_MOUSE:
387 return button_context_usb_hid_mouse;
345#endif 388#endif
346 default: 389 default:
347 return button_context_standard; 390 return button_context_standard;
diff --git a/apps/keymaps/keymap-gigabeat-s.c b/apps/keymaps/keymap-gigabeat-s.c
index 4fb7e1b3f1..6c5b6decb5 100644
--- a/apps/keymaps/keymap-gigabeat-s.c
+++ b/apps/keymaps/keymap-gigabeat-s.c
@@ -468,40 +468,91 @@ static const struct button_mapping remote_button_context_right_is_inc[] = {
468 LAST_ITEM_IN_LIST 468 LAST_ITEM_IN_LIST
469}; /* remote_button_context_right_is_inc */ 469}; /* remote_button_context_right_is_inc */
470 470
471#ifdef HAVE_USBSTACK 471#ifdef USB_ENABLE_HID
472static const struct button_mapping button_context_usb_hid[] = { 472static const struct button_mapping button_context_usb_hid[] = {
473 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 473 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
474 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 474 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
475 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 475 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
476 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 476 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
477 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 477 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_START },
478 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 478 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_START },
479 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 479 { ACTION_USB_HID_QUIT, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
480 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 480 { ACTION_USB_HID_QUIT_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
481 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 481 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
482 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 482 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
483 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 483 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
484 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 484 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
485 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 485 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
486 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 486 { ACTION_USB_HID_SELECT, BUTTON_BACK|BUTTON_REL, BUTTON_BACK },
487 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
488 { ACTION_USB_HID_SELECT_LONG, BUTTON_BACK|BUTTON_REPEAT, BUTTON_BACK },
489 { ACTION_USB_HID_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
490 { ACTION_USB_HID_MENU_LONG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
491 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
492 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
487 493
488 LAST_ITEM_IN_LIST 494 LAST_ITEM_IN_LIST
489}; /* button_context_usb_hid */ 495}; /* button_context_usb_hid */
490 496
491static const struct button_mapping remote_button_context_usb_hid[] = { 497static const struct button_mapping remote_button_context_usb_hid[] = {
492 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 498 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
493 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 499 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
494 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, 500 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
495 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, 501 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
496 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 502 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
497 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 503 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
498 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 504 { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
499 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 505 { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF},
500 { ACTION_USB_HID_MUTE, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_NONE }, 506 { ACTION_USB_HID_SELECT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
501 { ACTION_USB_HID_MENU, BUTTON_RC_DSP, BUTTON_NONE }, 507 { ACTION_USB_HID_SELECT_LONG, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
508 { ACTION_USB_HID_MENU, BUTTON_RC_DSP|BUTTON_REPEAT, BUTTON_RC_DSP },
509 { ACTION_USB_HID_MODE, BUTTON_RC_DSP|BUTTON_REL, BUTTON_RC_DSP },
502 510
503 LAST_ITEM_IN_LIST 511 LAST_ITEM_IN_LIST
504}; /* remote_button_context_usb_hid */ 512}; /* remote_button_context_usb_hid */
513
514static const struct button_mapping button_context_usb_hid_mouse[] = {
515 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
516 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
517 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
518 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
519 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
520 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
521 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
522 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
523 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
524 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_BACK|BUTTON_UP, BUTTON_NONE },
525 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
526 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_BACK|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
527 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
528 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_BACK|BUTTON_DOWN, BUTTON_NONE },
529 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
530 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_BACK|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
531 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
532 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_BACK|BUTTON_LEFT, BUTTON_NONE },
533 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
534 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_BACK|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
535 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
536 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_BACK|BUTTON_RIGHT, BUTTON_NONE },
537 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
538 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_BACK|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
539 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_MENU|BUTTON_UP, BUTTON_NONE },
540 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_MENU|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
541 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_MENU|BUTTON_DOWN, BUTTON_NONE },
542 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_MENU|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
543 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_MENU|BUTTON_LEFT, BUTTON_NONE },
544 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_MENU|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
545 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_MENU|BUTTON_RIGHT, BUTTON_NONE },
546 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_MENU|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
547 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
548 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_BACK, BUTTON_NONE },
549 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
550 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE },
551 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_MENU, BUTTON_NONE },
552 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_MENU|BUTTON_REL, BUTTON_NONE },
553
554 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
555}; /* button_context_usb_hid_mouse */
505#endif 556#endif
506 557
507static const struct button_mapping* get_context_mapping_remote( int context ) 558static const struct button_mapping* get_context_mapping_remote( int context )
@@ -546,7 +597,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
546 case CONTEXT_FM: 597 case CONTEXT_FM:
547 return remote_button_context_radio; 598 return remote_button_context_radio;
548 599
549#ifdef HAVE_USBSTACK 600#ifdef USB_ENABLE_HID
550 case CONTEXT_USB_HID: 601 case CONTEXT_USB_HID:
551 return remote_button_context_usb_hid; 602 return remote_button_context_usb_hid;
552#endif 603#endif
@@ -617,9 +668,11 @@ const struct button_mapping* get_context_mapping(int context)
617 case CONTEXT_FM: 668 case CONTEXT_FM:
618 return button_context_radio; 669 return button_context_radio;
619 670
620#ifdef HAVE_USBSTACK 671#ifdef USB_ENABLE_HID
621 case CONTEXT_USB_HID: 672 case CONTEXT_USB_HID:
622 return button_context_usb_hid; 673 return button_context_usb_hid;
674 case CONTEXT_USB_HID_MOUSE:
675 return button_context_usb_hid_mouse;
623#endif 676#endif
624 default: 677 default:
625 return button_context_standard; 678 return button_context_standard;
diff --git a/apps/keymaps/keymap-h10.c b/apps/keymaps/keymap-h10.c
index ad1ed64c5a..81673397c3 100644
--- a/apps/keymaps/keymap-h10.c
+++ b/apps/keymaps/keymap-h10.c
@@ -337,30 +337,37 @@ static const struct button_mapping button_context_radio[] = {
337 337
338}; 338};
339 339
340#ifdef HAVE_USBSTACK 340#ifdef USB_ENABLE_HID
341static const struct button_mapping button_context_usb_hid[] = { 341static const struct button_mapping button_context_usb_hid[] = {
342 { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 342 { ACTION_USB_HID_INC, BUTTON_SCROLL_UP, BUTTON_NONE },
343 { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 343 { ACTION_USB_HID_INC, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE },
344 { ACTION_USB_HID_SKIPPREV, BUTTON_REW, BUTTON_NONE }, 344 { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN, BUTTON_NONE },
345 { ACTION_USB_HID_SKIPNEXT, BUTTON_FF, BUTTON_NONE }, 345 { ACTION_USB_HID_DEC, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
346 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP, BUTTON_NONE }, 346 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
347 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE }, 347 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
348 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE }, 348 { ACTION_USB_HID_QUIT, BUTTON_REW|BUTTON_REL, BUTTON_REW },
349 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 349 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
350 { ACTION_USB_HID_MENU, BUTTON_POWER, BUTTON_NONE }, 350 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
351 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
352 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
353 { ACTION_USB_HID_SELECT, BUTTON_FF|BUTTON_REL, BUTTON_FF },
354 { ACTION_USB_HID_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
355 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
351 356
352 LAST_ITEM_IN_LIST 357 LAST_ITEM_IN_LIST
353}; /* button_context_usb_hid */ 358}; /* button_context_usb_hid */
354 359
355static const struct button_mapping remote_button_context_usb_hid[] = { 360static const struct button_mapping remote_button_context_usb_hid[] = {
356 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 361 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
357 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 362 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
358 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_REW, BUTTON_NONE }, 363 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
359 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_FF, BUTTON_NONE }, 364 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
360 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 365 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
361 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 366 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
362 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 367 { ACTION_USB_HID_LEFT, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
363 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 368 { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
369 { ACTION_USB_HID_RIGHT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
370 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
364 371
365 LAST_ITEM_IN_LIST 372 LAST_ITEM_IN_LIST
366}; /* remote_button_context_usb_hid */ 373}; /* remote_button_context_usb_hid */
@@ -395,7 +402,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
395 return remote_button_context_pitchscreen; 402 return remote_button_context_pitchscreen;
396 case CONTEXT_RECSCREEN: 403 case CONTEXT_RECSCREEN:
397 return button_context_recscreen; 404 return button_context_recscreen;
398#ifdef HAVE_USBSTACK 405#ifdef USB_ENABLE_HID
399 case CONTEXT_USB_HID: 406 case CONTEXT_USB_HID:
400 return remote_button_context_usb_hid; 407 return remote_button_context_usb_hid;
401#endif 408#endif
@@ -453,7 +460,7 @@ const struct button_mapping* get_context_mapping(int context)
453 return button_context_recscreen; 460 return button_context_recscreen;
454 case CONTEXT_FM: 461 case CONTEXT_FM:
455 return button_context_radio; 462 return button_context_radio;
456#ifdef HAVE_USBSTACK 463#ifdef USB_ENABLE_HID
457 case CONTEXT_USB_HID: 464 case CONTEXT_USB_HID:
458 return button_context_usb_hid; 465 return button_context_usb_hid;
459#endif 466#endif
diff --git a/apps/keymaps/keymap-hdd1630.c b/apps/keymaps/keymap-hdd1630.c
index 4565c2807b..ddb357a8b1 100644
--- a/apps/keymaps/keymap-hdd1630.c
+++ b/apps/keymaps/keymap-hdd1630.c
@@ -284,25 +284,62 @@ static const struct button_mapping button_context_radio[] = {
284}; 284};
285#endif 285#endif
286 286
287#ifdef HAVE_USBSTACK 287#ifdef USB_ENABLE_HID
288static const struct button_mapping button_context_usb_hid[] = { 288static const struct button_mapping button_context_usb_hid[] = {
289 { ACTION_USB_HID_PLAY, BUTTON_VIEW, BUTTON_NONE }, 289 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
290 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 290 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
291 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 291 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
292 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 292 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
293 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 293 { ACTION_USB_HID_START, BUTTON_UP|BUTTON_REL, BUTTON_UP },
294 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 294 { ACTION_USB_HID_START_LONG, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
295 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 295 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
296 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 296 { ACTION_USB_HID_QUIT_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
297 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 297 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
298 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 298 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
299 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 299 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
300 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 300 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
301 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 301 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
302 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 302 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
303 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
304 { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
305 { ACTION_USB_HID_MODE, BUTTON_VIEW|BUTTON_REL, BUTTON_VIEW },
306 { ACTION_USB_HID_MODE_LONG, BUTTON_VIEW|BUTTON_REPEAT, BUTTON_VIEW },
303 307
304 LAST_ITEM_IN_LIST 308 LAST_ITEM_IN_LIST
305}; /* button_context_usb_hid */ 309}; /* button_context_usb_hid */
310
311static const struct button_mapping button_context_usb_hid_mouse[] = {
312 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_UP, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_POWER|BUTTON_UP, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_POWER|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_POWER|BUTTON_DOWN, BUTTON_NONE },
331 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_POWER|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
332 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_NONE },
333 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_POWER|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
334 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_POWER|BUTTON_RIGHT, BUTTON_NONE },
335 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_POWER|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
336 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
337 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
338 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_POWER, BUTTON_NONE },
339 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_POWER|BUTTON_REL, BUTTON_NONE },
340
341 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
342}; /* button_context_usb_hid_mouse */
306#endif 343#endif
307 344
308const struct button_mapping* get_context_mapping(int context) 345const struct button_mapping* get_context_mapping(int context)
@@ -352,9 +389,11 @@ const struct button_mapping* get_context_mapping(int context)
352 case CONTEXT_FM: 389 case CONTEXT_FM:
353 return button_context_radio; 390 return button_context_radio;
354#endif 391#endif
355#ifdef HAVE_USBSTACK 392#ifdef USB_ENABLE_HID
356 case CONTEXT_USB_HID: 393 case CONTEXT_USB_HID:
357 return button_context_usb_hid; 394 return button_context_usb_hid;
395 case CONTEXT_USB_HID_MOUSE:
396 return button_context_usb_hid_mouse;
358#endif 397#endif
359 } 398 }
360 return button_context_standard; 399 return button_context_standard;
diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c
index 774597a3c0..99c7f93511 100644
--- a/apps/keymaps/keymap-ipod.c
+++ b/apps/keymaps/keymap-ipod.c
@@ -193,21 +193,48 @@ const struct button_mapping button_context_recscreen[] = {
193}; /* button_context_recscreen */ 193}; /* button_context_recscreen */
194#endif 194#endif
195 195
196#ifdef HAVE_USBSTACK 196#ifdef USB_ENABLE_HID
197static const struct button_mapping button_context_usb_hid[] = { 197static const struct button_mapping button_context_usb_hid[] = {
198 { ACTION_USB_HID_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 198 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD, BUTTON_NONE },
199 { ACTION_USB_HID_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 199 { ACTION_USB_HID_INC, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE },
200 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 200 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE },
201 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 201 { ACTION_USB_HID_DEC, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE },
202 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE }, 202 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
203 { ACTION_USB_HID_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, 203 { ACTION_USB_HID_QUIT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
204 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE }, 204 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
205 { ACTION_USB_HID_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE }, 205 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
206 { ACTION_USB_HID_MUTE, BUTTON_SELECT, BUTTON_NONE }, 206 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
207 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 207 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
208 { ACTION_USB_HID_SELECT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
209 { ACTION_USB_HID_SELECT_LONG, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
210 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
211 { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
208 212
209 LAST_ITEM_IN_LIST 213 LAST_ITEM_IN_LIST
210}; /* button_context_usb_hid */ 214}; /* button_context_usb_hid */
215
216static const struct button_mapping button_context_usb_hid_mouse[] = {
217 { ACTION_USB_HID_MOUSE_UP, BUTTON_MENU, BUTTON_NONE },
218 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
219 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_PLAY, BUTTON_NONE },
220 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
221 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
222 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
223 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
224 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
225 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_SELECT|BUTTON_MENU, BUTTON_NONE },
226 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_SELECT|BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE },
227 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_SELECT|BUTTON_PLAY, BUTTON_NONE },
228 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_SELECT|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
229 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_SELECT|BUTTON_LEFT, BUTTON_NONE },
230 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_SELECT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
231 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_SELECT|BUTTON_RIGHT, BUTTON_NONE },
232 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_SELECT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
233 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_SELECT, BUTTON_NONE },
234 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_SELECT|BUTTON_REL, BUTTON_NONE },
235
236 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
237}; /* button_context_usb_hid_mouse */
211#endif 238#endif
212 239
213#if BUTTON_REMOTE != 0 240#if BUTTON_REMOTE != 0
@@ -242,16 +269,18 @@ static const struct button_mapping remote_button_context_wps[] = {
242 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 269 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
243}; 270};
244 271
245#ifdef HAVE_USBSTACK 272#ifdef USB_ENABLE_HID
246static const struct button_mapping remote_button_context_usb_hid[] = { 273static const struct button_mapping remote_button_context_usb_hid[] = {
247 { ACTION_USB_HID_PLAY, BUTTON_RC_PLAY, BUTTON_NONE }, 274 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP, BUTTON_NONE },
248 { ACTION_USB_HID_STOP, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 275 { ACTION_USB_HID_INC, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
249 { ACTION_USB_HID_SKIPPREV, BUTTON_RC_LEFT, BUTTON_NONE }, 276 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
250 { ACTION_USB_HID_SKIPNEXT, BUTTON_RC_RIGHT, BUTTON_NONE }, 277 { ACTION_USB_HID_DEC, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
251 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE }, 278 { ACTION_USB_HID_START, BUTTON_RC_PLAY|BUTTON_REL, BUTTON_RC_PLAY },
252 { ACTION_USB_HID_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 279 { ACTION_USB_HID_QUIT, BUTTON_RC_PLAY|BUTTON_REPEAT, BUTTON_RC_PLAY },
253 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE }, 280 { ACTION_USB_HID_LEFT, BUTTON_RC_LEFT|BUTTON_REL, BUTTON_RC_LEFT },
254 { ACTION_USB_HID_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 281 { ACTION_USB_HID_LEFT_LONG, BUTTON_RC_LEFT|BUTTON_REPEAT, BUTTON_RC_LEFT },
282 { ACTION_USB_HID_RIGHT, BUTTON_RC_RIGHT|BUTTON_REL, BUTTON_RC_RIGHT },
283 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RC_RIGHT|BUTTON_REPEAT, BUTTON_RC_RIGHT },
255 284
256 LAST_ITEM_IN_LIST 285 LAST_ITEM_IN_LIST
257}; /* remote_button_context_usb_hid */ 286}; /* remote_button_context_usb_hid */
@@ -265,7 +294,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
265 { 294 {
266 case CONTEXT_WPS: 295 case CONTEXT_WPS:
267 return remote_button_context_wps; 296 return remote_button_context_wps;
268#ifdef HAVE_USBSTACK 297#ifdef USB_ENABLE_HID
269 case CONTEXT_USB_HID: 298 case CONTEXT_USB_HID:
270 return remote_button_context_usb_hid; 299 return remote_button_context_usb_hid;
271#endif 300#endif
@@ -321,9 +350,11 @@ const struct button_mapping* get_context_mapping(int context)
321 case CONTEXT_RECSCREEN: 350 case CONTEXT_RECSCREEN:
322 return button_context_recscreen; 351 return button_context_recscreen;
323#endif 352#endif
324#ifdef HAVE_USBSTACK 353#ifdef USB_ENABLE_HID
325 case CONTEXT_USB_HID: 354 case CONTEXT_USB_HID:
326 return button_context_usb_hid; 355 return button_context_usb_hid;
356 case CONTEXT_USB_HID_MOUSE:
357 return button_context_usb_hid_mouse;
327#endif 358#endif
328 default: 359 default:
329 return button_context_standard; 360 return button_context_standard;
diff --git a/apps/keymaps/keymap-mr100.c b/apps/keymaps/keymap-mr100.c
index bf9da0de58..a605131465 100644
--- a/apps/keymaps/keymap-mr100.c
+++ b/apps/keymaps/keymap-mr100.c
@@ -315,7 +315,7 @@ static const struct button_mapping remote_button_context_tree[] = {
315 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 315 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
316}; 316};
317 317
318#ifdef HAVE_USBSTACK 318#ifdef USB_ENABLE_HID
319static const struct button_mapping button_context_usb_hid[] = { 319static const struct button_mapping button_context_usb_hid[] = {
320 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 320 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE },
321 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 321 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE },
@@ -357,7 +357,7 @@ static const struct button_mapping* get_context_mapping_remote( int context )
357 case CONTEXT_MAINMENU: 357 case CONTEXT_MAINMENU:
358 case CONTEXT_TREE: 358 case CONTEXT_TREE:
359 return remote_button_context_tree; 359 return remote_button_context_tree;
360#ifdef HAVE_USBSTACK 360#ifdef USB_ENABLE_HID
361 case CONTEXT_USB_HID: 361 case CONTEXT_USB_HID:
362 return remote_button_context_usb_hid; 362 return remote_button_context_usb_hid;
363#endif 363#endif
@@ -411,7 +411,7 @@ const struct button_mapping* get_context_mapping(int context)
411 return button_context_pitchscreen; 411 return button_context_pitchscreen;
412 case CONTEXT_KEYBOARD: 412 case CONTEXT_KEYBOARD:
413 return button_context_keyboard; 413 return button_context_keyboard;
414#ifdef HAVE_USBSTACK 414#ifdef USB_ENABLE_HID
415 case CONTEXT_USB_HID: 415 case CONTEXT_USB_HID:
416 return button_context_usb_hid; 416 return button_context_usb_hid;
417#endif 417#endif
diff --git a/apps/keymaps/keymap-ondavx747.c b/apps/keymaps/keymap-ondavx747.c
index 6eb2230d49..ee590599b6 100644
--- a/apps/keymaps/keymap-ondavx747.c
+++ b/apps/keymaps/keymap-ondavx747.c
@@ -167,14 +167,16 @@ static const struct button_mapping button_context_keyboard[] = {
167 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 167 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
168}; /* button_context_keyboard */ 168}; /* button_context_keyboard */
169 169
170#ifdef HAVE_USBSTACK 170#ifdef USB_ENABLE_HID
171static const struct button_mapping button_context_usb_hid[] = { 171static const struct button_mapping button_context_usb_hid[] = {
172 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 172 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
173 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 173 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
174 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 174 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
175 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 175 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
176 { ACTION_USB_HID_MUTE, BUTTON_POWER, BUTTON_NONE }, 176 { ACTION_USB_HID_QUIT, BUTTON_POWER|BUTTON_REPEAT, BUTTON_SELECT },
177 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 177 { ACTION_USB_HID_SELECT, BUTTON_POWER|BUTTON_REL, BUTTON_SELECT },
178 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
179 { ACTION_USB_HID_MODE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
178 180
179 LAST_ITEM_IN_LIST 181 LAST_ITEM_IN_LIST
180}; /* button_context_usb_hid */ 182}; /* button_context_usb_hid */
diff --git a/apps/keymaps/keymap-ondavx777.c b/apps/keymaps/keymap-ondavx777.c
index 99f509b18f..f492a1964f 100644
--- a/apps/keymaps/keymap-ondavx777.c
+++ b/apps/keymaps/keymap-ondavx777.c
@@ -110,7 +110,7 @@ static const struct button_mapping button_context_keyboard[] = {
110 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 110 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
111}; /* button_context_keyboard */ 111}; /* button_context_keyboard */
112 112
113#ifdef HAVE_USBSTACK 113#ifdef USB_ENABLE_HID
114static const struct button_mapping button_context_usb_hid[] = { 114static const struct button_mapping button_context_usb_hid[] = {
115 LAST_ITEM_IN_LIST 115 LAST_ITEM_IN_LIST
116}; /* button_context_usb_hid */ 116}; /* button_context_usb_hid */
@@ -162,7 +162,7 @@ const struct button_mapping* target_get_context_mapping(int context)
162 return button_context_pitchscreen; 162 return button_context_pitchscreen;
163 case CONTEXT_KEYBOARD: 163 case CONTEXT_KEYBOARD:
164 return button_context_keyboard; 164 return button_context_keyboard;
165#ifdef HAVE_USBSTACK 165#ifdef USB_ENABLE_HID
166 case CONTEXT_USB_HID: 166 case CONTEXT_USB_HID:
167 return button_context_usb_hid; 167 return button_context_usb_hid;
168#endif 168#endif
diff --git a/apps/keymaps/keymap-sa9200.c b/apps/keymaps/keymap-sa9200.c
index 3e83932347..cb9c746cf3 100644
--- a/apps/keymaps/keymap-sa9200.c
+++ b/apps/keymaps/keymap-sa9200.c
@@ -276,30 +276,66 @@ static const struct button_mapping button_context_keyboard[] = {
276 LAST_ITEM_IN_LIST 276 LAST_ITEM_IN_LIST
277}; /* button_context_keyboard */ 277}; /* button_context_keyboard */
278 278
279#ifdef HAVE_USBSTACK 279#ifdef USB_ENABLE_HID
280static const struct button_mapping button_context_usb_hid[] = { 280static const struct button_mapping button_context_usb_hid[] = {
281 { ACTION_USB_HID_PLAY, BUTTON_PLAY, BUTTON_NONE }, 281 { ACTION_USB_HID_INC, BUTTON_UP, BUTTON_NONE },
282 { ACTION_USB_HID_STOP, BUTTON_PREV, BUTTON_NONE }, 282 { ACTION_USB_HID_INC, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
283 { ACTION_USB_HID_STOP, BUTTON_POWER, BUTTON_NONE }, 283 { ACTION_USB_HID_INC, BUTTON_VOL_UP, BUTTON_NONE },
284 284 { ACTION_USB_HID_INC, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE },
285 { ACTION_USB_HID_SKIPPREV, BUTTON_LEFT, BUTTON_NONE }, 285 { ACTION_USB_HID_DEC, BUTTON_DOWN, BUTTON_NONE },
286 { ACTION_USB_HID_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE }, 286 { ACTION_USB_HID_DEC, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
287 287 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN, BUTTON_NONE },
288 { ACTION_USB_HID_VOLUP, BUTTON_UP, BUTTON_NONE }, 288 { ACTION_USB_HID_DEC, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE },
289 { ACTION_USB_HID_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, 289 { ACTION_USB_HID_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
290 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 290 { ACTION_USB_HID_START_LONG, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
291 { ACTION_USB_HID_VOLUP, BUTTON_VOL_UP|BUTTON_REPEAT, BUTTON_NONE }, 291 { ACTION_USB_HID_QUIT, BUTTON_PREV|BUTTON_REL, BUTTON_PREV },
292 292 { ACTION_USB_HID_QUIT_LONG, BUTTON_PREV|BUTTON_REPEAT, BUTTON_PREV },
293 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, 293 { ACTION_USB_HID_LEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
294 { ACTION_USB_HID_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 294 { ACTION_USB_HID_LEFT_LONG, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
295 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 295 { ACTION_USB_HID_RIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
296 { ACTION_USB_HID_VOLDOWN, BUTTON_VOL_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 296 { ACTION_USB_HID_RIGHT_LONG, BUTTON_RIGHT|BUTTON_REPEAT BUTTON_RIGHT },
297 297 { ACTION_USB_HID_SELECT, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
298 { ACTION_USB_HID_MUTE, BUTTON_NEXT, BUTTON_NONE }, 298 { ACTION_USB_HID_SELECT_LONG, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NEXT },
299 { ACTION_USB_HID_MENU, BUTTON_MENU, BUTTON_NONE }, 299 { ACTION_USB_HID_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
300 { ACTION_USB_HID_MENU_LONG, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
301 { ACTION_USB_HID_MODE, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
302 { ACTION_USB_HID_MODE_LONG, BUTTON_POWER|BUTTON_REPEAT, BUTTON_POWER },
300 303
301 LAST_ITEM_IN_LIST 304 LAST_ITEM_IN_LIST
302}; /* button_context_usb_hid */ 305}; /* button_context_usb_hid */
306
307static const struct button_mapping button_context_usb_hid_mouse[] = {
308 { ACTION_USB_HID_MOUSE_UP, BUTTON_UP, BUTTON_NONE },
309 { ACTION_USB_HID_MOUSE_UP_REP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
310 { ACTION_USB_HID_MOUSE_DOWN, BUTTON_DOWN, BUTTON_NONE },
311 { ACTION_USB_HID_MOUSE_DOWN_REP, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
312 { ACTION_USB_HID_MOUSE_LEFT, BUTTON_LEFT, BUTTON_NONE },
313 { ACTION_USB_HID_MOUSE_LEFT_REP, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
314 { ACTION_USB_HID_MOUSE_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
315 { ACTION_USB_HID_MOUSE_RIGHT_REP, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
316 { ACTION_USB_HID_MOUSE_LDRAG_UP, BUTTON_PREV|BUTTON_UP, BUTTON_NONE },
317 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, BUTTON_PREV|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
318 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, BUTTON_PREV|BUTTON_DOWN, BUTTON_NONE },
319 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, BUTTON_PREV|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
320 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, BUTTON_PREV|BUTTON_LEFT, BUTTON_NONE },
321 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, BUTTON_PREV|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
322 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, BUTTON_PREV|BUTTON_RIGHT, BUTTON_NONE },
323 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, BUTTON_PREV|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
324 { ACTION_USB_HID_MOUSE_RDRAG_UP, BUTTON_NEXT|BUTTON_UP, BUTTON_NONE },
325 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, BUTTON_NEXT|BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
326 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, BUTTON_NEXT|BUTTON_DOWN, BUTTON_NONE },
327 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, BUTTON_NEXT|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
328 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, BUTTON_NEXT|BUTTON_LEFT, BUTTON_NONE },
329 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, BUTTON_NEXT|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE },
330 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, BUTTON_NEXT|BUTTON_RIGHT, BUTTON_NONE },
331 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, BUTTON_NEXT|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
332 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, BUTTON_PREV, BUTTON_NONE },
333 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, BUTTON_PREV|BUTTON_REL, BUTTON_NONE },
334 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, BUTTON_NEXT, BUTTON_NONE },
335 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, BUTTON_NEXT|BUTTON_REL, BUTTON_NONE },
336
337 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_USB_HID)
338}; /* button_context_usb_hid_mouse */
303#endif 339#endif
304 340
305const struct button_mapping* get_context_mapping(int context) 341const struct button_mapping* get_context_mapping(int context)
@@ -349,9 +385,11 @@ const struct button_mapping* get_context_mapping(int context)
349 case CONTEXT_KEYBOARD: 385 case CONTEXT_KEYBOARD:
350 return button_context_keyboard; 386 return button_context_keyboard;
351 387
352#ifdef HAVE_USBSTACK 388#ifdef USB_ENABLE_HID
353 case CONTEXT_USB_HID: 389 case CONTEXT_USB_HID:
354 return button_context_usb_hid; 390 return button_context_usb_hid;
391 case CONTEXT_USB_HID_MOUSE:
392 return button_context_usb_hid_mouse;
355#endif 393#endif
356 } 394 }
357 return button_context_standard; 395 return button_context_standard;
diff --git a/apps/keymaps/keymap-touchscreen.c b/apps/keymaps/keymap-touchscreen.c
index 4b86efa29e..499eb2b562 100644
--- a/apps/keymaps/keymap-touchscreen.c
+++ b/apps/keymaps/keymap-touchscreen.c
@@ -251,13 +251,26 @@ static const struct button_mapping button_context_radio[] = {
251 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_FM) 251 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_FM)
252}; /* button_context_radio */ 252}; /* button_context_radio */
253 253
254#ifdef HAVE_USBSTACK 254#ifdef USB_ENABLE_HID
255static const struct button_mapping button_context_usb_hid[] = { 255static const struct button_mapping button_context_usb_hid[] = {
256 { ACTION_USB_HID_PLAY, BUTTON_TOPRIGHT, BUTTON_NONE }, 256 { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT },
257 { ACTION_USB_HID_SKIPPREV, BUTTON_MIDLEFT, BUTTON_NONE }, 257 { ACTION_USB_HID_INC, BUTTON_BOTTOMRIGHT|BUTTON_REPEAT, BUTTON_BOTTOMRIGHT },
258 { ACTION_USB_HID_SKIPNEXT, BUTTON_MIDRIGHT, BUTTON_NONE }, 258 { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REL, BUTTON_BOTTOMMIDDLE },
259 { ACTION_USB_HID_MUTE, BUTTON_CENTER, BUTTON_NONE }, 259 { ACTION_USB_HID_DEC, BUTTON_BOTTOMMIDDLE|BUTTON_REPEAT, BUTTON_BOTTOMMIDDLE },
260 { ACTION_USB_HID_MENU, BUTTON_TOPLEFT, BUTTON_NONE }, 260 { ACTION_USB_HID_START, BUTTON_TOPMIDDLE|BUTTON_REL, BUTTON_TOPMIDDLE },
261 { ACTION_USB_HID_START_LONG, BUTTON_TOPMIDDLE|BUTTON_REPEAT, BUTTON_TOPMIDDLE },
262 { ACTION_USB_HID_QUIT, BUTTON_BOTTOMLEFT|BUTTON_REL, BUTTON_BOTTOMLEFT },
263 { ACTION_USB_HID_QUIT_LONG, BUTTON_BOTTOMLEFT|BUTTON_REPEAT, BUTTON_BOTTOMLEFT },
264 { ACTION_USB_HID_LEFT, BUTTON_MIDLEFT|BUTTON_REL, BUTTON_MIDLEFT },
265 { ACTION_USB_HID_LEFT_LONG, BUTTON_MIDLEFT|BUTTON_REPEAT, BUTTON_MIDLEFT },
266 { ACTION_USB_HID_RIGHT, BUTTON_MIDRIGHT|BUTTON_REL, BUTTON_MIDRIGHT },
267 { ACTION_USB_HID_RIGHT_LONG, BUTTON_MIDRIGHT|BUTTON_REPEAT, BUTTON_MIDRIGHT },
268 { ACTION_USB_HID_SELECT, BUTTON_CENTER|BUTTON_REL, BUTTON_CENTER },
269 { ACTION_USB_HID_SELECT_LONG, BUTTON_CENTER|BUTTON_REPEAT, BUTTON_CENTER },
270 { ACTION_USB_HID_MENU, BUTTON_TOPRIGHT|BUTTON_REL, BUTTON_TOPRIGHT },
271 { ACTION_USB_HID_MENU_LONG, BUTTON_TOPRIGHT|BUTTON_REPEAT, BUTTON_TOPRIGHT },
272 { ACTION_USB_HID_MODE, BUTTON_TOPLEFT|BUTTON_REL, BUTTON_TOPLEFT },
273 { ACTION_USB_HID_MODE_LONG, BUTTON_TOPLEFT|BUTTON_REPEAT, BUTTON_TOPLEFT },
261 274
262 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_USB_HID) 275 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_USB_HID)
263}; /* button_context_usb_hid */ 276}; /* button_context_usb_hid */
@@ -315,7 +328,7 @@ const struct button_mapping* get_context_mapping(int context)
315 return button_context_pitchscreen; 328 return button_context_pitchscreen;
316 case CONTEXT_KEYBOARD: 329 case CONTEXT_KEYBOARD:
317 return button_context_keyboard; 330 return button_context_keyboard;
318#ifdef HAVE_USBSTACK 331#ifdef USB_ENABLE_HID
319 case CONTEXT_USB_HID: 332 case CONTEXT_USB_HID:
320 return button_context_usb_hid; 333 return button_context_usb_hid;
321#endif 334#endif
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 72e0a4ce90..541e7ffbe0 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12654,6 +12654,76 @@
12654 </voice> 12654 </voice>
12655</phrase> 12655</phrase>
12656<phrase> 12656<phrase>
12657 id: LANG_USB_KEYPAD_MODE
12658 desc: in settings_menu
12659 user: core
12660 <source>
12661 *: "USB Keypad Mode:"
12662 </source>
12663 <dest>
12664 *: "USB Keypad Mode:"
12665 </dest>
12666 <voice>
12667 *: "USB Keypad Mode"
12668 </voice>
12669</phrase>
12670<phrase>
12671 id: LANG_MULTIMEDIA
12672 desc: in settings_menu
12673 user: core
12674 <source>
12675 *: "Multimedia"
12676 </source>
12677 <dest>
12678 *: "Multimedia"
12679 </dest>
12680 <voice>
12681 *: "Multimedia"
12682 </voice>
12683</phrase>
12684<phrase>
12685 id: LANG_PRESENTATION
12686 desc: in settings_menu
12687 user: core
12688 <source>
12689 *: "Presentation"
12690 </source>
12691 <dest>
12692 *: "Presentation"
12693 </dest>
12694 <voice>
12695 *: "Presentation"
12696 </voice>
12697</phrase>
12698<phrase>
12699 id: LANG_BROWSER
12700 desc: in settings_menu
12701 user: core
12702 <source>
12703 *: "Browser"
12704 </source>
12705 <dest>
12706 *: "Browser"
12707 </dest>
12708 <voice>
12709 *: "Browser"
12710 </voice>
12711</phrase>
12712<phrase>
12713 id: LANG_MOUSE
12714 desc: in settings_menu
12715 user: core
12716 <source>
12717 *: "Mouse"
12718 </source>
12719 <dest>
12720 *: "Mouse"
12721 </dest>
12722 <voice>
12723 *: "Mouse"
12724 </voice>
12725</phrase>
12726<phrase>
12657 id: LANG_SKIN_RAM_USAGE 12727 id: LANG_SKIN_RAM_USAGE
12658 desc: how much RAM the skins are using 12728 desc: how much RAM the skins are using
12659 user: core 12729 user: core
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index fdc775877a..71a6089e68 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -252,6 +252,9 @@ MENUITEM_SETTING(serial_bitrate, &global_settings.serial_bitrate, NULL);
252MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL); 252MENUITEM_SETTING(accessory_supply, &global_settings.accessory_supply, NULL);
253#endif 253#endif
254MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); 254MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL);
255#ifdef USB_ENABLE_HID
256MENUITEM_SETTING(usb_keypad_mode, &global_settings.usb_keypad_mode, NULL);
257#endif
255 258
256#ifdef HAVE_BUTTON_LIGHT 259#ifdef HAVE_BUTTON_LIGHT
257MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL); 260MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL);
@@ -300,6 +303,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
300#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING 303#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
301 &touchpad_sensitivity, 304 &touchpad_sensitivity,
302#endif 305#endif
306#ifdef USB_ENABLE_HID
307 &usb_keypad_mode,
308#endif
303 ); 309 );
304 310
305/* SYSTEM MENU */ 311/* SYSTEM MENU */
diff --git a/apps/plugin.c b/apps/plugin.c
index aa7077edae..945e99ec71 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -51,7 +51,7 @@
51#include "bidi.h" 51#include "bidi.h"
52#endif 52#endif
53 53
54#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 54#ifdef USB_ENABLE_HID
55#include "usbstack/usb_hid.h" 55#include "usbstack/usb_hid.h"
56#endif 56#endif
57 57
@@ -367,7 +367,7 @@ static const struct plugin_api rockbox_api = {
367 queue_reply, 367 queue_reply,
368#endif 368#endif
369 usb_acknowledge, 369 usb_acknowledge,
370#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 370#ifdef USB_ENABLE_HID
371 usb_hid_send, 371 usb_hid_send,
372#endif 372#endif
373#ifdef RB_PROFILE 373#ifdef RB_PROFILE
diff --git a/apps/plugin.h b/apps/plugin.h
index b4a6b4fc1b..766a309c01 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -105,7 +105,7 @@ void* plugin_get_buffer(size_t *buffer_size);
105 105
106#include "yesno.h" 106#include "yesno.h"
107 107
108#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 108#ifdef USB_ENABLE_HID
109#include "usbstack/usb_hid_usage_tables.h" 109#include "usbstack/usb_hid_usage_tables.h"
110#endif 110#endif
111 111
@@ -491,7 +491,7 @@ struct plugin_api {
491#endif /* CONFIG_CODEC == SWCODEC */ 491#endif /* CONFIG_CODEC == SWCODEC */
492 492
493 void (*usb_acknowledge)(long id); 493 void (*usb_acknowledge)(long id);
494#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 494#ifdef USB_ENABLE_HID
495 void (*usb_hid_send)(usage_page_t usage_page, int id); 495 void (*usb_hid_send)(usage_page_t usage_page, int id);
496#endif 496#endif
497#ifdef RB_PROFILE 497#ifdef RB_PROFILE
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index b9061ee74b..4cfc3a8b0f 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -169,6 +169,6 @@ md5sum.c
169lua.c 169lua.c
170#endif 170#endif
171 171
172#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 172#ifdef USB_ENABLE_HID
173remote_control.c 173remote_control.c
174#endif 174#endif
diff --git a/apps/screens.c b/apps/screens.c
index a7a4b27ea8..65b64eab3e 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -37,7 +37,7 @@
37#if defined(HAVE_USBSTACK) 37#if defined(HAVE_USBSTACK)
38#include "usb_core.h" 38#include "usb_core.h"
39#ifdef USB_ENABLE_HID 39#ifdef USB_ENABLE_HID
40#include "usbstack/usb_hid.h" 40#include "usb_keymaps.h"
41#endif 41#endif
42#endif 42#endif
43#include "settings.h" 43#include "settings.h"
@@ -93,59 +93,32 @@ static int clamp_value_wrap(int value, int max, int min)
93#endif 93#endif
94 94
95#ifndef SIMULATOR 95#ifndef SIMULATOR
96
97#ifdef USB_ENABLE_HID
98int usb_keypad_mode;
99#endif
100
96static int handle_usb_events(void) 101static int handle_usb_events(void)
97{ 102{
98#if (CONFIG_STORAGE & STORAGE_MMC) 103#if (CONFIG_STORAGE & STORAGE_MMC)
99 int next_update=0; 104 int next_update=0;
100#endif /* STORAGE_MMC */ 105#endif /* STORAGE_MMC */
101 106
102#ifdef HAVE_TOUCHSCREEN
103 enum touchscreen_mode old_mode = touchscreen_get_mode();
104
105 /* TODO: Paint buttons on screens OR switch to point mode and use
106 * touchscreen as a touchpad to move the host's mouse cursor */
107 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
108#endif
109
110 /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */ 107 /* Don't return until we get SYS_USB_DISCONNECTED or SYS_TIMEOUT */
111 while(1) 108 while(1)
112 { 109 {
113 int button; 110 int button;
114#if defined(HAVE_USBSTACK) && defined(USB_ENABLE_HID) 111#ifdef USB_ENABLE_HID
115 bool hid_enabled = usb_core_driver_enabled(USB_DRIVER_HID); 112 if (usb_core_driver_enabled(USB_DRIVER_HID))
116
117 if (hid_enabled)
118 { 113 {
119 int id = HID_CONSUMER_USAGE_UNASSIGNED; 114 button = get_hid_usb_action();
120 button = get_action(CONTEXT_USB_HID, HZ/2);
121 115
122 switch (button) 116 /* On mode change, we need to refresh the screen */
117 if (button == ACTION_USB_HID_MODE ||
118 button == ACTION_USB_HID_MODE_LONG)
123 { 119 {
124 case ACTION_USB_HID_PLAY: 120 break;
125 id = HID_CONSUMER_USAGE_PLAY_PAUSE;
126 break;
127 case ACTION_USB_HID_STOP:
128 id = HID_CONSUMER_USAGE_STOP;
129 break;
130 case ACTION_USB_HID_SKIPPREV:
131 id = HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK;
132 break;
133 case ACTION_USB_HID_SKIPNEXT:
134 id = HID_CONSUMER_USAGE_SCAN_NEXT_TRACK;
135 break;
136 case ACTION_USB_HID_VOLDOWN:
137 id = HID_CONSUMER_USAGE_VOLUME_DECREMENT;
138 break;
139 case ACTION_USB_HID_VOLUP:
140 id = HID_CONSUMER_USAGE_VOLUME_INCREMENT;
141 break;
142 case ACTION_USB_HID_MUTE:
143 id = HID_CONSUMER_USAGE_MUTE;
144 break;
145 } 121 }
146
147 if (id != HID_CONSUMER_USAGE_UNASSIGNED)
148 usb_hid_send(HID_USAGE_PAGE_CONSUMER, id);
149 } 122 }
150 else 123 else
151#endif 124#endif
@@ -159,7 +132,7 @@ static int handle_usb_events(void)
159 { 132 {
160 case SYS_USB_DISCONNECTED: 133 case SYS_USB_DISCONNECTED:
161 usb_acknowledge(SYS_USB_DISCONNECTED_ACK); 134 usb_acknowledge(SYS_USB_DISCONNECTED_ACK);
162 goto Exit; 135 return 1;
163 case SYS_TIMEOUT: 136 case SYS_TIMEOUT:
164 break; 137 break;
165 } 138 }
@@ -174,14 +147,12 @@ static int handle_usb_events(void)
174 } 147 }
175#endif /* STORAGE_MMC */ 148#endif /* STORAGE_MMC */
176 } 149 }
177Exit: 150
178#ifdef HAVE_TOUCHSCREEN
179 touchscreen_set_mode(old_mode);
180#endif
181 return 0; 151 return 0;
182} 152}
183#endif 153#endif
184 154
155#define MODE_NAME_LEN 32
185void usb_screen(void) 156void usb_screen(void)
186{ 157{
187#ifdef USB_NONE 158#ifdef USB_NONE
@@ -190,55 +161,107 @@ void usb_screen(void)
190 int i; 161 int i;
191 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */ 162 int usb_bars = VP_SB_ALLSCREENS; /* force statusbars */
192 int old_bars = viewportmanager_get_statusbar(); 163 int old_bars = viewportmanager_get_statusbar();
164#if defined HAVE_TOUCHSCREEN
165 enum touchscreen_mode old_mode = touchscreen_get_mode();
193 166
194 FOR_NB_SCREENS(i) 167 /* TODO: Paint buttons on screens OR switch to point mode and use
168 * touchscreen as a touchpad to move the host's mouse cursor */
169 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
170#endif
171
172#ifndef SIMULATOR
173 usb_acknowledge(SYS_USB_CONNECTED_ACK);
174#endif
175
176#ifdef USB_ENABLE_HID
177 usb_keypad_mode = global_settings.usb_keypad_mode;
178#endif
179
180 while (1)
195 { 181 {
196 screens[i].backdrop_show(BACKDROP_MAIN); 182 FOR_NB_SCREENS(i)
197 screens[i].backlight_on();
198 screens[i].clear_display();
199#ifdef HAVE_REMOTE_LCD
200 if (i == SCREEN_REMOTE)
201 { 183 {
202 screens[i].bitmap(remote_usblogo, 184 screens[i].backdrop_show(BACKDROP_MAIN);
203 (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo), 185 screens[i].backlight_on();
204 (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2, 186 screens[i].clear_display();
205 BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo); 187#ifdef HAVE_REMOTE_LCD
206 } 188 if (i == SCREEN_REMOTE)
207 else 189 {
190 screens[i].bitmap(remote_usblogo,
191 (LCD_REMOTE_WIDTH-BMPWIDTH_remote_usblogo),
192 (LCD_REMOTE_HEIGHT-BMPHEIGHT_remote_usblogo)/2,
193 BMPWIDTH_remote_usblogo, BMPHEIGHT_remote_usblogo);
194 }
195 else
208#endif 196#endif
209 { 197 {
198 char mode_name[MODE_NAME_LEN];
199
210#ifdef HAVE_LCD_BITMAP 200#ifdef HAVE_LCD_BITMAP
211 screens[i].transparent_bitmap(usblogo, 201 screens[i].transparent_bitmap(usblogo,
212 (LCD_WIDTH-BMPWIDTH_usblogo), 202 (LCD_WIDTH-BMPWIDTH_usblogo),
213 (LCD_HEIGHT-BMPHEIGHT_usblogo)/2, 203 (LCD_HEIGHT-BMPHEIGHT_usblogo)/2,
214 BMPWIDTH_usblogo, BMPHEIGHT_usblogo); 204 BMPWIDTH_usblogo, BMPHEIGHT_usblogo);
205
206#ifdef USB_ENABLE_HID
207 int y, w, h;
208
209 screens[i].getstringsize(str(LANG_USB_KEYPAD_MODE), &w, &h);
210
211 y = (LCD_HEIGHT - BMPHEIGHT_usblogo) / 2 + BMPHEIGHT_usblogo + h;
212 screens[i].putsxy((LCD_WIDTH - w) / 2, y,
213 str(LANG_USB_KEYPAD_MODE));
214 y += 3 * h / 2;
215
216 snprintf(mode_name, MODE_NAME_LEN, "%s",
217 str(keypad_mode_name_get()));
218 screens[i].getstringsize(mode_name, &w, &h);
219 screens[i].putsxy((LCD_WIDTH - w) / 2, y, mode_name);
220#endif /* HID */
221#else /* HAVE_LCD_BITMAP */
222 screens[i].double_height(false);
223#ifdef USB_ENABLE_HID
224 snprintf(mode_name, MODE_NAME_LEN, "[USB Mode; %s]",
225 str(keypad_mode_name_get()));
226 screens[i].puts_scroll(0, 0, mode_name);
215#else 227#else
216 screens[i].double_height(false); 228 screens[i].puts_scroll(0, 0, "[USB Mode]");
217 screens[i].puts_scroll(0, 0, "[USB Mode]"); 229#endif
218 status_set_param(false); 230 status_set_param(false);
219 status_set_audio(false); 231 status_set_audio(false);
220 status_set_usb(true); 232 status_set_usb(true);
221#endif /* HAVE_LCD_BITMAP */ 233#endif /* HAVE_LCD_BITMAP */
222 } 234 }
223 screens[i].update(); 235 screens[i].update();
224 236
225 /* force statusbar by ignoring the setting */ 237 /* force statusbar by ignoring the setting */
226 usb_bars |= VP_SB_IGNORE_SETTING(i); 238 usb_bars |= VP_SB_IGNORE_SETTING(i);
227 } 239 }
228 240
229 viewportmanager_set_statusbar(usb_bars); 241 viewportmanager_set_statusbar(usb_bars);
230 242
231#ifdef SIMULATOR 243#ifdef SIMULATOR
232 while (1)
233 {
234 if (button_get_w_tmo(HZ/2)) 244 if (button_get_w_tmo(HZ/2))
235 break; 245 break;
236 send_event(GUI_EVENT_ACTIONUPDATE, NULL); 246 send_event(GUI_EVENT_ACTIONUPDATE, NULL);
237 }
238#else 247#else
239 usb_acknowledge(SYS_USB_CONNECTED_ACK); 248 if (handle_usb_events())
240 while (handle_usb_events()); 249 break;
241#endif /* SIMULATOR */ 250#endif /* SIMULATOR */
251 }
252
253#ifdef USB_ENABLE_HID
254 if (global_settings.usb_keypad_mode != usb_keypad_mode)
255 {
256 global_settings.usb_keypad_mode = usb_keypad_mode;
257 settings_save();
258 }
259#endif
260
261#ifdef HAVE_TOUCHSCREEN
262 touchscreen_set_mode(old_mode);
263#endif
264
242#ifdef HAVE_LCD_CHARCELLS 265#ifdef HAVE_LCD_CHARCELLS
243 status_set_usb(false); 266 status_set_usb(false);
244#endif /* HAVE_LCD_CHARCELLS */ 267#endif /* HAVE_LCD_CHARCELLS */
@@ -248,7 +271,7 @@ void usb_screen(void)
248 } 271 }
249 viewportmanager_set_statusbar(old_bars); 272 viewportmanager_set_statusbar(old_bars);
250 send_event(GUI_EVENT_REFRESH, NULL); 273 send_event(GUI_EVENT_REFRESH, NULL);
251 274
252#endif /* USB_NONE */ 275#endif /* USB_NONE */
253} 276}
254 277
diff --git a/apps/settings.h b/apps/settings.h
index ec92a81734..b208ee5872 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -768,7 +768,11 @@ struct user_settings
768 /* If values are just added to the end, no need to bump plugin API 768 /* If values are just added to the end, no need to bump plugin API
769 version. */ 769 version. */
770 /* new stuff to be added at the end */ 770 /* new stuff to be added at the end */
771 771
772#ifdef USB_ENABLE_HID
773 int usb_keypad_mode;
774#endif
775
772#ifdef HAVE_LCD_BITMAP 776#ifdef HAVE_LCD_BITMAP
773 unsigned char ui_vp_config[64]; /* viewport string for the lists */ 777 unsigned char ui_vp_config[64]; /* viewport string for the lists */
774#ifdef HAVE_REMOTE_LCD 778#ifdef HAVE_REMOTE_LCD
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 2e3632b949..34e8854421 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1613,6 +1613,13 @@ const struct settings_list settings[] = {
1613#endif 1613#endif
1614#endif 1614#endif
1615 1615
1616#ifdef USB_ENABLE_HID
1617 CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0,
1618 "usb keypad mode", "multimedia,presentation,browser,mouse",
1619 NULL, 3, ID2P(LANG_MULTIMEDIA), ID2P(LANG_PRESENTATION),
1620 ID2P(LANG_BROWSER), ID2P(LANG_MOUSE)),
1621#endif
1622
1616 /* Customizable list */ 1623 /* Customizable list */
1617#ifdef HAVE_LCD_BITMAP 1624#ifdef HAVE_LCD_BITMAP
1618 VIEWPORT_SETTING(ui_vp_config, "ui viewport"), 1625 VIEWPORT_SETTING(ui_vp_config, "ui viewport"),
diff --git a/apps/usb_keymaps.c b/apps/usb_keymaps.c
new file mode 100644
index 0000000000..c791b11b25
--- /dev/null
+++ b/apps/usb_keymaps.c
@@ -0,0 +1,249 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Tomer Shalev
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#include "config.h"
22
23#ifdef USB_ENABLE_HID
24#include "action.h"
25#include "lang.h"
26#include "usbstack/usb_hid.h"
27//#define LOGF_ENABLE
28#include "logf.h"
29
30#define MODIFIER(modifier, key) ((key) | (modifier << 8))
31
32#define ALT(key) MODIFIER(HID_KEYBOARD_LEFT_ALT, key)
33#define CTRL(key) MODIFIER(HID_KEYBOARD_LEFT_CONTROL, key)
34#define SHIFT(key) MODIFIER(HID_KEYBOARD_LEFT_SHIFT, key)
35
36#define NUM_KEY_MAPPINGS (sizeof(hid_key_mappings) / \
37 sizeof(hid_key_mappings[0]))
38
39typedef struct
40{
41 int action;
42 int id;
43} mapping_t;
44
45typedef struct
46{
47 int lang_name;
48 usage_page_t usage_page;
49 mapping_t mapping[];
50} hid_key_mapping_t;
51
52static const hid_key_mapping_t hid_key_mapping_multimedia = {
53 LANG_MULTIMEDIA,
54 HID_USAGE_PAGE_CONSUMER,
55 {
56 /* Volume up */
57 { ACTION_USB_HID_DEC, HID_CONSUMER_USAGE_VOLUME_DECREMENT },
58 /* Volume down */
59 { ACTION_USB_HID_INC, HID_CONSUMER_USAGE_VOLUME_INCREMENT },
60 /* Volume mute */
61 { ACTION_USB_HID_SELECT, HID_CONSUMER_USAGE_MUTE },
62 /* Play / pause */
63 { ACTION_USB_HID_START, HID_CONSUMER_USAGE_PLAY_PAUSE },
64 /* Stop */
65 { ACTION_USB_HID_QUIT, HID_CONSUMER_USAGE_STOP },
66 /* Scan previous track */
67 { ACTION_USB_HID_LEFT, HID_CONSUMER_USAGE_SCAN_PREVIOUS_TRACK },
68 /* Scan next track */
69 { ACTION_USB_HID_RIGHT, HID_CONSUMER_USAGE_SCAN_NEXT_TRACK },
70 { 0, 0 },
71 }
72};
73
74static const hid_key_mapping_t hid_key_mapping_presentation = {
75 LANG_PRESENTATION,
76 HID_USAGE_PAGE_KEYBOARD_KEYPAD,
77 {
78 /* Slideshow start */
79 { ACTION_USB_HID_START, HID_KEYBOARD_F5 },
80 /* Slideshow leave */
81 { ACTION_USB_HID_QUIT, HID_KEYBOARD_ESCAPE },
82 /* Slide previous */
83 { ACTION_USB_HID_LEFT, HID_KEYBOARD_P },
84 /* Slide next */
85 { ACTION_USB_HID_RIGHT, HID_KEYBOARD_N },
86 /* Slide first */
87 { ACTION_USB_HID_LEFT_LONG, HID_KEYBOARD_HOME },
88 /* Slide Last */
89 { ACTION_USB_HID_RIGHT_LONG, HID_KEYBOARD_END },
90 /* Black screen */
91 { ACTION_USB_HID_MENU, HID_KEYBOARD_DOT },
92 /* White screen */
93 { ACTION_USB_HID_MENU_LONG, HID_KEYBOARD_COMMA },
94 /* Link previous */
95 { ACTION_USB_HID_DEC, SHIFT(HID_KEYBOARD_TAB) },
96 /* Link next */
97 { ACTION_USB_HID_INC, HID_KEYBOARD_TAB },
98 /* 'Mouse click' */
99 { ACTION_USB_HID_SELECT, HID_KEYBOARD_RETURN },
100 /* 'Mouse over' */
101 { ACTION_USB_HID_SELECT_LONG, SHIFT(HID_KEYBOARD_RETURN) },
102 { 0, 0 },
103 }
104};
105
106static const hid_key_mapping_t hid_key_mapping_browser = {
107 LANG_BROWSER,
108 HID_USAGE_PAGE_KEYBOARD_KEYPAD,
109 {
110 /* Scroll up */
111 { ACTION_USB_HID_DEC, HID_KEYBOARD_UP_ARROW },
112 /* Scroll down */
113 { ACTION_USB_HID_INC, HID_KEYBOARD_DOWN_ARROW },
114 /* Scroll page up */
115 { ACTION_USB_HID_START, HID_KEYBOARD_PAGE_UP },
116 /* Scroll page down */
117 { ACTION_USB_HID_MENU, HID_KEYBOARD_PAGE_DOWN },
118 /* Zoom in */
119 { ACTION_USB_HID_START_LONG, CTRL(HID_KEYPAD_PLUS) },
120 /* Zoom out */
121 { ACTION_USB_HID_MENU_LONG, CTRL(HID_KEYPAD_MINUS) },
122 /* Zoom reset */
123 { ACTION_USB_HID_SELECT_LONG, CTRL(HID_KEYPAD_0_AND_INSERT) },
124 /* Tab previous */
125 { ACTION_USB_HID_LEFT, CTRL(HID_KEYBOARD_PAGE_UP) },
126 /* Tab next */
127 { ACTION_USB_HID_RIGHT, CTRL(HID_KEYBOARD_PAGE_DOWN) },
128 /* Tab close */
129 { ACTION_USB_HID_QUIT_LONG, CTRL(HID_KEYBOARD_W) },
130 /* History back */
131 { ACTION_USB_HID_LEFT_LONG, ALT(HID_KEYBOARD_LEFT_ARROW) },
132 /* History forward */
133 { ACTION_USB_HID_RIGHT_LONG, ALT(HID_KEYBOARD_RIGHT_ARROW) },
134 /* Full-Screen */
135 { ACTION_USB_HID_SELECT, HID_KEYBOARD_F11 },
136 { 0, 0 },
137 }
138};
139
140#ifdef HAVE_USB_HID_MOUSE
141static const hid_key_mapping_t hid_key_mapping_mouse = {
142 LANG_MOUSE,
143 HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
144 {
145 /* Mouse up */
146 { ACTION_USB_HID_MOUSE_UP, HID_MOUSE_UP },
147 { ACTION_USB_HID_MOUSE_UP_REP, HID_MOUSE_UP_REP },
148 { ACTION_USB_HID_MOUSE_LDRAG_UP, HID_MOUSE_LDRAG_UP },
149 { ACTION_USB_HID_MOUSE_LDRAG_UP_REP, HID_MOUSE_LDRAG_UP_REP },
150 { ACTION_USB_HID_MOUSE_RDRAG_UP, HID_MOUSE_RDRAG_UP },
151 { ACTION_USB_HID_MOUSE_RDRAG_UP_REP, HID_MOUSE_RDRAG_UP_REP },
152 /* Mouse down */
153 { ACTION_USB_HID_MOUSE_DOWN, HID_MOUSE_DOWN },
154 { ACTION_USB_HID_MOUSE_DOWN_REP, HID_MOUSE_DOWN_REP },
155 { ACTION_USB_HID_MOUSE_LDRAG_DOWN, HID_MOUSE_LDRAG_DOWN },
156 { ACTION_USB_HID_MOUSE_LDRAG_DOWN_REP, HID_MOUSE_LDRAG_DOWN_REP },
157 { ACTION_USB_HID_MOUSE_RDRAG_DOWN, HID_MOUSE_RDRAG_DOWN },
158 { ACTION_USB_HID_MOUSE_RDRAG_DOWN_REP, HID_MOUSE_RDRAG_DOWN_REP },
159 /* Mouse left */
160 { ACTION_USB_HID_MOUSE_LEFT, HID_MOUSE_LEFT },
161 { ACTION_USB_HID_MOUSE_LEFT_REP, HID_MOUSE_LEFT_REP },
162 { ACTION_USB_HID_MOUSE_LDRAG_LEFT, HID_MOUSE_LDRAG_LEFT },
163 { ACTION_USB_HID_MOUSE_LDRAG_LEFT_REP, HID_MOUSE_LDRAG_LEFT_REP },
164 { ACTION_USB_HID_MOUSE_RDRAG_LEFT, HID_MOUSE_RDRAG_LEFT },
165 { ACTION_USB_HID_MOUSE_RDRAG_LEFT_REP, HID_MOUSE_RDRAG_LEFT_REP },
166 /* Mouse right */
167 { ACTION_USB_HID_MOUSE_RIGHT, HID_MOUSE_RIGHT },
168 { ACTION_USB_HID_MOUSE_RIGHT_REP, HID_MOUSE_RIGHT_REP },
169 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT, HID_MOUSE_LDRAG_RIGHT },
170 { ACTION_USB_HID_MOUSE_LDRAG_RIGHT_REP, HID_MOUSE_LDRAG_RIGHT_REP },
171 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT, HID_MOUSE_RDRAG_RIGHT },
172 { ACTION_USB_HID_MOUSE_RDRAG_RIGHT_REP, HID_MOUSE_RDRAG_RIGHT_REP },
173 /* Mouse buttons */
174 { ACTION_USB_HID_MOUSE_BUTTON_LEFT, HID_MOUSE_BUTTON_LEFT },
175 { ACTION_USB_HID_MOUSE_BUTTON_LEFT_REL, HID_MOUSE_BUTTON_LEFT_REL },
176 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT, HID_MOUSE_BUTTON_RIGHT },
177 { ACTION_USB_HID_MOUSE_BUTTON_RIGHT_REL, HID_MOUSE_BUTTON_RIGHT_REL },
178 /* Mouse wheel scroll up */
179 { ACTION_USB_HID_DEC, HID_MOUSE_SCROLL_UP },
180 /* Mouse wheel scroll down */
181 { ACTION_USB_HID_INC, HID_MOUSE_SCROLL_DOWN },
182 { 0, 0 },
183 }
184};
185
186#define USB_KEYPAD_MODE_MOUSE 3 /* Value of the mouse setting (hard-coded) */
187#endif /* HAVE_USB_HID_MOUSE */
188
189static const hid_key_mapping_t *hid_key_mappings[] =
190{
191 &hid_key_mapping_multimedia,
192 &hid_key_mapping_presentation,
193 &hid_key_mapping_browser,
194#ifdef HAVE_USB_HID_MOUSE
195 &hid_key_mapping_mouse,
196#endif
197};
198
199extern int usb_keypad_mode;
200
201int get_hid_usb_action(void)
202{
203 int action, context = CONTEXT_USB_HID;
204
205#ifdef HAVE_USB_HID_MOUSE
206 if (usb_keypad_mode == USB_KEYPAD_MODE_MOUSE)
207 context = CONTEXT_USB_HID_MOUSE;
208#endif
209
210 action = get_action(context, HZ/4);
211 /* Skip key mappings in a cyclic way */
212 if (action == ACTION_USB_HID_MODE)
213 {
214 usb_keypad_mode = (usb_keypad_mode + 1) % NUM_KEY_MAPPINGS;
215 }
216 else if (action == ACTION_USB_HID_MODE_LONG)
217 {
218 usb_keypad_mode = (usb_keypad_mode - 1) % NUM_KEY_MAPPINGS;
219 }
220 else if (action > ACTION_USB_HID_FIRST && action < ACTION_USB_HID_LAST)
221 {
222 const mapping_t *mapping;
223 const hid_key_mapping_t *key_mapping =
224 hid_key_mappings[usb_keypad_mode];
225
226 for (mapping = key_mapping->mapping; mapping->action; mapping++)
227 {
228 if (action == mapping->action)
229 {
230 logf("Action %d", action);
231 usb_hid_send(key_mapping->usage_page, mapping->id);
232 break;
233 }
234 }
235#ifdef DEBUG
236 if (!mapping->action)
237 logf("Action %d not found", action);
238#endif
239 }
240
241 return action;
242}
243
244int keypad_mode_name_get(void)
245{
246 return hid_key_mappings[usb_keypad_mode]->lang_name;
247}
248
249#endif
diff --git a/apps/usb_keymaps.h b/apps/usb_keymaps.h
new file mode 100644
index 0000000000..8b08bfda2d
--- /dev/null
+++ b/apps/usb_keymaps.h
@@ -0,0 +1,28 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2009 Tomer Shalev
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#ifndef _USB_KEYMAPS_H_
22#define _USB_KEYMAPS_H_
23
24int get_hid_usb_action(void);
25
26int keypad_mode_name_get(void);
27
28#endif