summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Goode <jeffg7@gmail.com>2010-04-01 03:14:44 +0000
committerJeffrey Goode <jeffg7@gmail.com>2010-04-01 03:14:44 +0000
commitd5e6bc7a8c413218ec1372fd54157e9639ab67b4 (patch)
tree2be93c700ef9c5e8f85cc7dbbfab7f9f842c92f0
parent39e78993f317349dacfc4e8d1abb703117636696 (diff)
downloadrockbox-d5e6bc7a8c413218ec1372fd54157e9639ab67b4.tar.gz
rockbox-d5e6bc7a8c413218ec1372fd54157e9639ab67b4.zip
FS#11081 - Hotkey patch. Many targets supported, but some keymaps need work before they can be switched on
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25414 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/action.h2
-rw-r--r--apps/features.txt4
-rw-r--r--apps/gui/wps.c4
-rw-r--r--apps/keymaps/keymap-av300.c3
-rw-r--r--apps/keymaps/keymap-c100.c3
-rw-r--r--apps/keymaps/keymap-c200.c3
-rw-r--r--apps/keymaps/keymap-clip.c7
-rw-r--r--apps/keymaps/keymap-creativezv.c7
-rw-r--r--apps/keymaps/keymap-creativezvm.c7
-rw-r--r--apps/keymaps/keymap-e200.c3
-rw-r--r--apps/keymaps/keymap-fuze.c3
-rw-r--r--apps/keymaps/keymap-gigabeat-s.c7
-rw-r--r--apps/keymaps/keymap-gigabeat.c7
-rw-r--r--apps/keymaps/keymap-h10.c3
-rw-r--r--apps/keymaps/keymap-h1x0_h3x0.c3
-rw-r--r--apps/keymaps/keymap-hdd1630.c7
-rw-r--r--apps/keymaps/keymap-hdd6330.c7
-rw-r--r--apps/keymaps/keymap-iaudio67.c7
-rw-r--r--apps/keymaps/keymap-ipod.c3
-rw-r--r--apps/keymaps/keymap-m3.c3
-rw-r--r--apps/keymaps/keymap-meizu-m6sl.c7
-rw-r--r--apps/keymaps/keymap-mini2440.c7
-rw-r--r--apps/keymaps/keymap-mr100.c7
-rw-r--r--apps/keymaps/keymap-player.c3
-rw-r--r--apps/keymaps/keymap-recorder.c3
-rw-r--r--apps/keymaps/keymap-sa9200.c7
-rw-r--r--apps/keymaps/keymap-touchscreen.c7
-rw-r--r--apps/keymaps/keymap-vibe500.c7
-rw-r--r--apps/keymaps/keymap-yh8xx_yh9xx.c7
-rw-r--r--apps/lang/english.lang68
-rw-r--r--apps/menu.c17
-rw-r--r--apps/menus/settings_menu.c61
-rw-r--r--apps/onplay.c206
-rw-r--r--apps/onplay.h2
-rw-r--r--apps/playlist_catalog.c2
-rw-r--r--apps/root_menu.h1
-rw-r--r--apps/settings.h7
-rw-r--r--apps/settings_list.c7
-rw-r--r--apps/tree.c6
-rw-r--r--firmware/export/config/archosfmrecorder.h2
-rw-r--r--firmware/export/config/archosondiofm.h2
-rw-r--r--firmware/export/config/archosondiosp.h2
-rw-r--r--firmware/export/config/archosplayer.h2
-rw-r--r--firmware/export/config/archosrecorder.h2
-rw-r--r--firmware/export/config/archosrecorderv2.h2
-rw-r--r--firmware/export/config/cowond2.h2
-rw-r--r--firmware/export/config/creativezv.h2
-rw-r--r--firmware/export/config/gigabeatfx.h2
-rw-r--r--firmware/export/config/gigabeats.h2
-rw-r--r--firmware/export/config/gogearhdd1630.h3
-rw-r--r--firmware/export/config/gogearhdd6330.h2
-rw-r--r--firmware/export/config/gogearsa9200.h2
-rw-r--r--firmware/export/config/iaudio7.h2
-rw-r--r--firmware/export/config/iaudiom3.h3
-rw-r--r--firmware/export/config/iaudiom5.h3
-rw-r--r--firmware/export/config/iaudiox5.h3
-rw-r--r--firmware/export/config/ipod1g2g.h2
-rw-r--r--firmware/export/config/ipod3g.h2
-rw-r--r--firmware/export/config/ipod4g.h3
-rw-r--r--firmware/export/config/ipodcolor.h3
-rw-r--r--firmware/export/config/ipodmini1g.h3
-rw-r--r--firmware/export/config/ipodmini2g.h3
-rw-r--r--firmware/export/config/ipodnano1g.h3
-rw-r--r--firmware/export/config/ipodnano2g.h2
-rw-r--r--firmware/export/config/ipodvideo.h3
-rw-r--r--firmware/export/config/iriverh10.h3
-rw-r--r--firmware/export/config/iriverh100.h3
-rw-r--r--firmware/export/config/iriverh10_5gb.h3
-rw-r--r--firmware/export/config/iriverh120.h3
-rw-r--r--firmware/export/config/iriverh300.h3
-rw-r--r--firmware/export/config/iriverifp7xx.h2
-rw-r--r--firmware/export/config/logikdax.h2
-rw-r--r--firmware/export/config/lyreproto1.h2
-rw-r--r--firmware/export/config/meizum3.h2
-rw-r--r--firmware/export/config/meizum6sl.h2
-rw-r--r--firmware/export/config/meizum6sp.h2
-rw-r--r--firmware/export/config/mini2440.h2
-rw-r--r--firmware/export/config/mrobe100.h3
-rw-r--r--firmware/export/config/mrobe500.h2
-rw-r--r--firmware/export/config/ondavx747.h2
-rw-r--r--firmware/export/config/ondavx767.h2
-rw-r--r--firmware/export/config/ondavx777.h2
-rw-r--r--firmware/export/config/samsungyh820.h3
-rw-r--r--firmware/export/config/samsungyh920.h3
-rw-r--r--firmware/export/config/samsungyh925.h3
-rw-r--r--firmware/export/config/samsungyps3.h2
-rw-r--r--firmware/export/config/sansac100.h2
-rw-r--r--firmware/export/config/sansac200.h3
-rw-r--r--firmware/export/config/sansac200v2.h3
-rw-r--r--firmware/export/config/sansaclip.h3
-rw-r--r--firmware/export/config/sansaclipplus.h3
-rw-r--r--firmware/export/config/sansaclipv2.h3
-rw-r--r--firmware/export/config/sansae200.h2
-rw-r--r--firmware/export/config/sansae200v2.h3
-rw-r--r--firmware/export/config/sansafuze.h2
-rw-r--r--firmware/export/config/sansafuzev2.h2
-rw-r--r--firmware/export/config/sansam200.h2
-rw-r--r--firmware/export/config/sansam200v4.h2
-rw-r--r--firmware/export/config/sansaview.h3
-rw-r--r--firmware/export/config/tatungtpj1022.h3
-rw-r--r--firmware/export/config/vibe500.h3
-rw-r--r--firmware/export/config/zenvisionm30gb.h2
-rw-r--r--firmware/export/config/zenvisionm60gb.h2
103 files changed, 649 insertions, 32 deletions
diff --git a/apps/action.h b/apps/action.h
index 63ec905e51..ec9727c120 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -136,6 +136,7 @@ enum {
136 ACTION_WPS_ABSETA_PREVDIR, /* these should be safe to put together seen as */ 136 ACTION_WPS_ABSETA_PREVDIR, /* these should be safe to put together seen as */
137 ACTION_WPS_ABSETB_NEXTDIR, /* you shouldnt want to change dir in ab-mode */ 137 ACTION_WPS_ABSETB_NEXTDIR, /* you shouldnt want to change dir in ab-mode */
138 ACTION_WPS_ABRESET, 138 ACTION_WPS_ABRESET,
139 ACTION_WPS_HOTKEY,
139 140
140 /* list and tree page up/down */ 141 /* list and tree page up/down */
141 ACTION_LISTTREE_PGUP,/* optional */ 142 ACTION_LISTTREE_PGUP,/* optional */
@@ -151,6 +152,7 @@ enum {
151 ACTION_TREE_PGRIGHT,/* optional */ 152 ACTION_TREE_PGRIGHT,/* optional */
152 ACTION_TREE_STOP, 153 ACTION_TREE_STOP,
153 ACTION_TREE_WPS, 154 ACTION_TREE_WPS,
155 ACTION_TREE_HOTKEY,
154 156
155 /* radio */ 157 /* radio */
156 ACTION_FM_MENU, 158 ACTION_FM_MENU,
diff --git a/apps/features.txt b/apps/features.txt
index af0da5b355..0bfe695aeb 100644
--- a/apps/features.txt
+++ b/apps/features.txt
@@ -70,6 +70,10 @@ hold_button
70remote_button_hold 70remote_button_hold
71#endif 71#endif
72 72
73#if defined(HAVE_HOTKEY)
74hotkey
75#endif
76
73#if defined(HAVE_LCD_BITMAP) 77#if defined(HAVE_LCD_BITMAP)
74lcd_bitmap 78lcd_bitmap
75#endif 79#endif
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index b6a42769fe..afd7f3f2d0 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -888,10 +888,12 @@ long gui_wps_show(void)
888 switch(button) 888 switch(button)
889 { 889 {
890 case ACTION_WPS_CONTEXT: 890 case ACTION_WPS_CONTEXT:
891 case ACTION_WPS_HOTKEY:
891 { 892 {
893 bool hotkey = button == ACTION_WPS_HOTKEY;
892 gwps_leave_wps(); 894 gwps_leave_wps();
893 int retval = onplay(wps_state.id3->path, 895 int retval = onplay(wps_state.id3->path,
894 FILE_ATTR_AUDIO, CONTEXT_WPS); 896 FILE_ATTR_AUDIO, CONTEXT_WPS, hotkey);
895 /* if music is stopped in the context menu we want to exit the wps */ 897 /* if music is stopped in the context menu we want to exit the wps */
896 if (retval == ONPLAY_MAINMENU 898 if (retval == ONPLAY_MAINMENU
897 || !audio_status()) 899 || !audio_status())
diff --git a/apps/keymaps/keymap-av300.c b/apps/keymaps/keymap-av300.c
index 7d66921c3a..b80219f232 100644
--- a/apps/keymaps/keymap-av300.c
+++ b/apps/keymaps/keymap-av300.c
@@ -75,7 +75,7 @@ static const struct button_mapping button_context_wps[] = {
75 { ACTION_WPS_MENU, BUTTON_F1|BUTTON_REL, BUTTON_F1 }, 75 { ACTION_WPS_MENU, BUTTON_F1|BUTTON_REL, BUTTON_F1 },
76 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT }, 76 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
77 { ACTION_WPS_QUICKSCREEN, BUTTON_F2|BUTTON_REPEAT, BUTTON_NONE }, 77 { ACTION_WPS_QUICKSCREEN, BUTTON_F2|BUTTON_REPEAT, BUTTON_NONE },
78 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_F2|BUTTON_REL, BUTTON_F2 }, 78 { ACTION_WPS_HOTKEY, BUTTON_F2|BUTTON_REL, BUTTON_F2 },
79 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON }, 79 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON },
80 { ACTION_WPS_ID3SCREEN, BUTTON_F1|BUTTON_ON, BUTTON_NONE }, 80 { ACTION_WPS_ID3SCREEN, BUTTON_F1|BUTTON_ON, BUTTON_NONE },
81 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP, BUTTON_ON }, 81 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP, BUTTON_ON },
@@ -106,6 +106,7 @@ static const struct button_mapping button_context_settings[] = {
106static const struct button_mapping button_context_tree[] = { 106static const struct button_mapping button_context_tree[] = {
107 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON }, 107 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON },
108 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE }, 108 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE },
109 { ACTION_TREE_HOTKEY, BUTTON_F2|BUTTON_REL, BUTTON_F2 },
109 { ACTION_NONE, BUTTON_ON, BUTTON_NONE }, 110 { ACTION_NONE, BUTTON_ON, BUTTON_NONE },
110 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP, BUTTON_ON }, 111 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP, BUTTON_ON },
111 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_ON|BUTTON_UP }, 112 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_ON|BUTTON_UP },
diff --git a/apps/keymaps/keymap-c100.c b/apps/keymaps/keymap-c100.c
index 3312da3e1d..58f1f5f42b 100644
--- a/apps/keymaps/keymap-c100.c
+++ b/apps/keymaps/keymap-c100.c
@@ -69,7 +69,7 @@ static const struct button_mapping button_context_wps[] = {
69 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_VOLUP, BUTTON_SELECT }, 69 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_VOLUP, BUTTON_SELECT },
70 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_VOLDOWN, BUTTON_SELECT }, 70 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_VOLDOWN, BUTTON_SELECT },
71 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 71 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
72 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE }, 72 { ACTION_WPS_HOTKEY, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
73 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, 73 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
74 74
75 LAST_ITEM_IN_LIST 75 LAST_ITEM_IN_LIST
@@ -104,6 +104,7 @@ static const struct button_mapping button_context_list[] = {
104static const struct button_mapping button_context_tree[] = { 104static const struct button_mapping button_context_tree[] = {
105 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP }, 105 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP },
106 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 106 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
107 { ACTION_TREE_HOTKEY, BUTTON_SELECT|BUTTON_DOWN, BUTTON_NONE },
107 108
108 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 109 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
109}; /* button_context_tree */ 110}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-c200.c b/apps/keymaps/keymap-c200.c
index 487a2db1a7..f19440019c 100644
--- a/apps/keymaps/keymap-c200.c
+++ b/apps/keymaps/keymap-c200.c
@@ -81,7 +81,7 @@ static const struct button_mapping button_context_wps[] = {
81 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 81 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
82 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN, BUTTON_NONE }, 82 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN, BUTTON_NONE },
83 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE }, 83 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE },
84 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_REC|BUTTON_REL, BUTTON_REC }, 84 { ACTION_WPS_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
85 85
86 LAST_ITEM_IN_LIST 86 LAST_ITEM_IN_LIST
87}; /* button_context_wps */ 87}; /* button_context_wps */
@@ -123,6 +123,7 @@ static const struct button_mapping button_context_list[] = {
123 123
124static const struct button_mapping button_context_tree[] = { 124static const struct button_mapping button_context_tree[] = {
125 { ACTION_TREE_WPS, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, 125 { ACTION_TREE_WPS, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
126 { ACTION_TREE_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
126 127
127 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 128 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
128}; /* button_context_tree */ 129}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-clip.c b/apps/keymaps/keymap-clip.c
index afef805681..942968b20f 100644
--- a/apps/keymaps/keymap-clip.c
+++ b/apps/keymaps/keymap-clip.c
@@ -82,7 +82,11 @@ static const struct button_mapping button_context_wps[] = {
82 82
83 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT }, 83 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT },
84 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_SELECT }, 84 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_SELECT },
85#ifdef HAVE_HOTKEY
86 { ACTION_WPS_HOTKEY, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
87#else
85 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, 88 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
89#endif
86 90
87#ifndef HAS_BUTTON_HOLD /* Clip+ */ 91#ifndef HAS_BUTTON_HOLD /* Clip+ */
88 { ACTION_STD_KEYLOCK, BUTTON_HOME|BUTTON_SELECT, BUTTON_NONE }, 92 { ACTION_STD_KEYLOCK, BUTTON_HOME|BUTTON_SELECT, BUTTON_NONE },
@@ -131,6 +135,9 @@ static const struct button_mapping button_context_list[] = {
131static const struct button_mapping button_context_tree[] = { 135static const struct button_mapping button_context_tree[] = {
132 { ACTION_TREE_WPS, BUTTON_HOME|BUTTON_SELECT, BUTTON_HOME }, 136 { ACTION_TREE_WPS, BUTTON_HOME|BUTTON_SELECT, BUTTON_HOME },
133 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 137 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
138#ifdef HAVE_HOTKEY
139// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
140#endif
134 141
135 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 142 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
136}; /* button_context_tree */ 143}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-creativezv.c b/apps/keymaps/keymap-creativezv.c
index fb8e542520..4108980720 100644
--- a/apps/keymaps/keymap-creativezv.c
+++ b/apps/keymaps/keymap-creativezv.c
@@ -92,7 +92,11 @@ static const struct button_mapping button_context_wps[] = {
92 92
93 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 93 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
94 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 94 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
95#ifdef HAVE_HOTKEY
96 { ACTION_WPS_HOTKEY, BUTTON_POWER, BUTTON_NONE },
97#else
95 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_POWER, BUTTON_NONE }, 98 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_POWER, BUTTON_NONE },
99#endif
96 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 100 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
97 101
98 { ACTION_WPS_ID3SCREEN, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, 102 { ACTION_WPS_ID3SCREEN, BUTTON_BACK|BUTTON_REL, BUTTON_NONE },
@@ -109,6 +113,9 @@ static const struct button_mapping button_context_tree[] = {
109 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 113 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
110 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 114 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
111 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 115 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
116#ifdef HAVE_HOTKEY
117// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
118#endif
112 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 119 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
113}; /* button_context_tree */ 120}; /* button_context_tree */
114 121
diff --git a/apps/keymaps/keymap-creativezvm.c b/apps/keymaps/keymap-creativezvm.c
index 37563248a1..5d1b25aa8d 100644
--- a/apps/keymaps/keymap-creativezvm.c
+++ b/apps/keymaps/keymap-creativezvm.c
@@ -91,7 +91,11 @@ static const struct button_mapping button_context_wps[] = {
91 91
92 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 92 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
93 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 93 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
94#ifdef HAVE_HOTKEY
95 { ACTION_WPS_HOTKEY, BUTTON_POWER, BUTTON_NONE },
96#else
94 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_POWER, BUTTON_NONE }, 97 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_POWER, BUTTON_NONE },
98#endif
95 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 99 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
96 100
97 { ACTION_WPS_ID3SCREEN, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, 101 { ACTION_WPS_ID3SCREEN, BUTTON_BACK|BUTTON_REL, BUTTON_NONE },
@@ -108,6 +112,9 @@ static const struct button_mapping button_context_tree[] = {
108 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 112 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
109 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 113 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
110 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 114 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
115#ifdef HAVE_HOTKEY
116// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
117#endif
111 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 118 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
112}; /* button_context_tree */ 119}; /* button_context_tree */
113 120
diff --git a/apps/keymaps/keymap-e200.c b/apps/keymaps/keymap-e200.c
index 367fdcb88f..aca8a9d7e3 100644
--- a/apps/keymaps/keymap-e200.c
+++ b/apps/keymaps/keymap-e200.c
@@ -80,7 +80,7 @@ static const struct button_mapping button_context_wps[] = {
80 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN }, 80 { ACTION_WPS_QUICKSCREEN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
81 81
82 { ACTION_WPS_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN }, 82 { ACTION_WPS_MENU, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
83 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_REC|BUTTON_REL, BUTTON_REC }, 83 { ACTION_WPS_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
84 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE }, 84 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE },
85 85
86 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT }, 86 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT },
@@ -115,6 +115,7 @@ static const struct button_mapping button_context_list[] = {
115static const struct button_mapping button_context_tree[] = { 115static const struct button_mapping button_context_tree[] = {
116 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP }, 116 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP },
117 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 117 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
118 { ACTION_TREE_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
118 119
119 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 120 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
120}; /* button_context_tree */ 121}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-fuze.c b/apps/keymaps/keymap-fuze.c
index 416674f814..7463b5d3bb 100644
--- a/apps/keymaps/keymap-fuze.c
+++ b/apps/keymaps/keymap-fuze.c
@@ -83,7 +83,7 @@ static const struct button_mapping button_context_wps[] = {
83 83
84 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT }, 84 { ACTION_WPS_PITCHSCREEN, BUTTON_SELECT|BUTTON_UP, BUTTON_SELECT },
85 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_SELECT }, 85 { ACTION_WPS_ID3SCREEN, BUTTON_SELECT|BUTTON_DOWN, BUTTON_SELECT },
86 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_HOME|BUTTON_REL, BUTTON_HOME }, 86 { ACTION_WPS_HOTKEY, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
87 87
88 LAST_ITEM_IN_LIST 88 LAST_ITEM_IN_LIST
89}; /* button_context_wps */ 89}; /* button_context_wps */
@@ -114,6 +114,7 @@ static const struct button_mapping button_context_list[] = {
114static const struct button_mapping button_context_tree[] = { 114static const struct button_mapping button_context_tree[] = {
115 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP }, 115 { ACTION_TREE_WPS, BUTTON_UP|BUTTON_REL, BUTTON_UP },
116 { ACTION_TREE_STOP, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME }, 116 { ACTION_TREE_STOP, BUTTON_HOME|BUTTON_REPEAT, BUTTON_HOME },
117 { ACTION_TREE_HOTKEY, BUTTON_HOME|BUTTON_REL, BUTTON_HOME },
117 118
118 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 119 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
119}; /* button_context_tree */ 120}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-gigabeat-s.c b/apps/keymaps/keymap-gigabeat-s.c
index d690b24e77..343d6b4f9c 100644
--- a/apps/keymaps/keymap-gigabeat-s.c
+++ b/apps/keymaps/keymap-gigabeat-s.c
@@ -100,7 +100,11 @@ static const struct button_mapping button_context_wps[] = {
100 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 100 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
101 101
102 { ACTION_WPS_PITCHSCREEN, BUTTON_BACK|BUTTON_UP, BUTTON_BACK }, 102 { ACTION_WPS_PITCHSCREEN, BUTTON_BACK|BUTTON_UP, BUTTON_BACK },
103#ifdef HAVE_HOTKEY
104 { ACTION_WPS_HOTKEY, BUTTON_BACK|BUTTON_DOWN, BUTTON_NONE },
105#else
103 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_BACK|BUTTON_DOWN, BUTTON_NONE }, 106 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_BACK|BUTTON_DOWN, BUTTON_NONE },
107#endif
104 108
105 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 109 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
106 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 110 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -134,6 +138,9 @@ static const struct button_mapping button_context_tree[] = {
134 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 138 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
135 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 139 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
136 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 140 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
141#ifdef HAVE_HOTKEY
142// { ACTION_TREE_HOTKEY,BUTTON_NONE, BUTTON_NONE },
143#endif
137 144
138 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 145 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
139}; /* button_context_tree */ 146}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-gigabeat.c b/apps/keymaps/keymap-gigabeat.c
index ccb6084ada..61d0a593c8 100644
--- a/apps/keymaps/keymap-gigabeat.c
+++ b/apps/keymaps/keymap-gigabeat.c
@@ -93,7 +93,11 @@ static const struct button_mapping button_context_wps[] = {
93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
94 94
95 { ACTION_WPS_PITCHSCREEN, BUTTON_A|BUTTON_UP, BUTTON_A }, 95 { ACTION_WPS_PITCHSCREEN, BUTTON_A|BUTTON_UP, BUTTON_A },
96#ifdef HAVE_HOTKEY
97 { ACTION_WPS_HOTKEY, BUTTON_A|BUTTON_DOWN, BUTTON_NONE },
98#else
96 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_A|BUTTON_DOWN, BUTTON_NONE }, 99 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_A|BUTTON_DOWN, BUTTON_NONE },
100#endif
97 101
98 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 102 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
99 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 103 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -127,6 +131,9 @@ static const struct button_mapping button_context_tree[] = {
127 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 131 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
128 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 132 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
129 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 133 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
134#ifdef HAVE_HOTKEY
135// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
136#endif
130 137
131 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 138 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
132}; /* button_context_tree */ 139}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-h10.c b/apps/keymaps/keymap-h10.c
index 8597e24023..ffda90c4e8 100644
--- a/apps/keymaps/keymap-h10.c
+++ b/apps/keymaps/keymap-h10.c
@@ -87,7 +87,7 @@ static const struct button_mapping button_context_wps[] = {
87 { ACTION_WPS_CONTEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT }, 87 { ACTION_WPS_CONTEXT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
88 { ACTION_WPS_QUICKSCREEN, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, 88 { ACTION_WPS_QUICKSCREEN, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
89 { ACTION_WPS_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 89 { ACTION_WPS_MENU, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
90 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_POWER|BUTTON_PLAY, BUTTON_NONE }, 90 { ACTION_WPS_HOTKEY, BUTTON_POWER|BUTTON_PLAY, BUTTON_NONE },
91 { ACTION_WPS_PITCHSCREEN, BUTTON_PLAY|BUTTON_LEFT, BUTTON_PLAY }, 91 { ACTION_WPS_PITCHSCREEN, BUTTON_PLAY|BUTTON_LEFT, BUTTON_PLAY },
92 { ACTION_WPS_ID3SCREEN, BUTTON_PLAY|BUTTON_RIGHT, BUTTON_PLAY }, 92 { ACTION_WPS_ID3SCREEN, BUTTON_PLAY|BUTTON_RIGHT, BUTTON_PLAY },
93 93
@@ -146,6 +146,7 @@ static const struct button_mapping remote_button_context_list[] = {
146static const struct button_mapping button_context_tree[] = { 146static const struct button_mapping button_context_tree[] = {
147 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 147 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
148 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 148 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
149 { ACTION_TREE_HOTKEY, BUTTON_POWER|BUTTON_PLAY, BUTTON_NONE },
149 150
150 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 151 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
151}; /* button_context_tree */ 152}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-h1x0_h3x0.c b/apps/keymaps/keymap-h1x0_h3x0.c
index 64d0f30b8e..31e38533f3 100644
--- a/apps/keymaps/keymap-h1x0_h3x0.c
+++ b/apps/keymaps/keymap-h1x0_h3x0.c
@@ -92,7 +92,7 @@ static const struct button_mapping button_context_wps[] = {
92 { ACTION_WPS_ABRESET, BUTTON_ON|BUTTON_SELECT, BUTTON_ON }, 92 { ACTION_WPS_ABRESET, BUTTON_ON|BUTTON_SELECT, BUTTON_ON },
93 { ACTION_WPS_ID3SCREEN, BUTTON_ON|BUTTON_MODE, BUTTON_NONE }, 93 { ACTION_WPS_ID3SCREEN, BUTTON_ON|BUTTON_MODE, BUTTON_NONE },
94 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE }, 94 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE },
95 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_REC|BUTTON_REL, BUTTON_REC }, 95 { ACTION_WPS_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
96 96
97 LAST_ITEM_IN_LIST 97 LAST_ITEM_IN_LIST
98}; /* button_context_wps */ 98}; /* button_context_wps */
@@ -112,6 +112,7 @@ static const struct button_mapping button_context_tree[] = {
112 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON }, 112 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON },
113 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE }, 113 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE },
114 { ACTION_TREE_STOP, BUTTON_OFF|BUTTON_REPEAT, BUTTON_NONE }, 114 { ACTION_TREE_STOP, BUTTON_OFF|BUTTON_REPEAT, BUTTON_NONE },
115 { ACTION_TREE_HOTKEY, BUTTON_REC|BUTTON_REL, BUTTON_REC },
115 116
116 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 117 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
117}; /* button_context_tree */ 118}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-hdd1630.c b/apps/keymaps/keymap-hdd1630.c
index d43fcd837d..b8de5eb84b 100644
--- a/apps/keymaps/keymap-hdd1630.c
+++ b/apps/keymaps/keymap-hdd1630.c
@@ -93,7 +93,11 @@ static const struct button_mapping button_context_wps[] = {
93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
94 94
95 { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW }, 95 { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW },
96#ifdef HAVE_HOTKEY
97 { ACTION_WPS_HOTKEY, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
98#else
96 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW }, 99 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
100#endif
97 101
98 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 102 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
99 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 103 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -127,6 +131,9 @@ static const struct button_mapping button_context_tree[] = {
127 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 131 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
128 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 132 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
129 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 133 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
134#ifdef HAVE_HOTKEY
135// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
136#endif
130 137
131 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 138 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
132}; /* button_context_tree */ 139}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-hdd6330.c b/apps/keymaps/keymap-hdd6330.c
index d43fcd837d..b8de5eb84b 100644
--- a/apps/keymaps/keymap-hdd6330.c
+++ b/apps/keymaps/keymap-hdd6330.c
@@ -93,7 +93,11 @@ static const struct button_mapping button_context_wps[] = {
93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 93 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
94 94
95 { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW }, 95 { ACTION_WPS_PITCHSCREEN, BUTTON_VIEW|BUTTON_UP, BUTTON_VIEW },
96#ifdef HAVE_HOTKEY
97 { ACTION_WPS_HOTKEY, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
98#else
96 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW }, 99 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_VIEW|BUTTON_DOWN, BUTTON_VIEW },
100#endif
97 101
98 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 102 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
99 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 103 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -127,6 +131,9 @@ static const struct button_mapping button_context_tree[] = {
127 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 131 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
128 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 132 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
129 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 133 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
134#ifdef HAVE_HOTKEY
135// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
136#endif
130 137
131 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 138 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
132}; /* button_context_tree */ 139}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-iaudio67.c b/apps/keymaps/keymap-iaudio67.c
index ec700c5411..45e85d439b 100644
--- a/apps/keymaps/keymap-iaudio67.c
+++ b/apps/keymaps/keymap-iaudio67.c
@@ -71,7 +71,11 @@ static const struct button_mapping button_context_wps[] = {
71 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, 71 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
72 72
73 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 73 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
74#ifdef HAVE_HOTKEY
75 { ACTION_WPS_HOTKEY, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
76#else
74 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 77 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
78#endif
75 { ACTION_WPS_STOP, BUTTON_STOP, BUTTON_NONE }, 79 { ACTION_WPS_STOP, BUTTON_STOP, BUTTON_NONE },
76 80
77 LAST_ITEM_IN_LIST 81 LAST_ITEM_IN_LIST
@@ -111,6 +115,9 @@ static const struct button_mapping button_context_list[] = {
111static const struct button_mapping button_context_tree[] = { 115static const struct button_mapping button_context_tree[] = {
112 // { ACTION_TREE_WPS, BUTTON_REC|BUTTON_VOLUP, BUTTON_REC }, 116 // { ACTION_TREE_WPS, BUTTON_REC|BUTTON_VOLUP, BUTTON_REC },
113 // { ACTION_TREE_STOP, BUTTON_REC|BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_REC|BUTTON_VOLUP }, 117 // { ACTION_TREE_STOP, BUTTON_REC|BUTTON_VOLUP|BUTTON_REPEAT, BUTTON_REC|BUTTON_VOLUP },
118#ifdef HAVE_HOTKEY
119 // { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
120#endif
114 121
115 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 122 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
116}; /* button_context_tree */ 123}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c
index 751c6d89aa..8b65f96130 100644
--- a/apps/keymaps/keymap-ipod.c
+++ b/apps/keymaps/keymap-ipod.c
@@ -59,6 +59,7 @@ static const struct button_mapping button_context_standard[] = {
59static const struct button_mapping button_context_tree[] = { 59static const struct button_mapping button_context_tree[] = {
60 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 60 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
61 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 61 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
62 { ACTION_TREE_HOTKEY, BUTTON_SELECT|BUTTON_PLAY, BUTTON_NONE },
62 63
63 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 64 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
64}; /* button_context_tree */ 65}; /* button_context_tree */
@@ -91,7 +92,7 @@ static const struct button_mapping button_context_wps[] = {
91 { ACTION_WPS_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE }, 92 { ACTION_WPS_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE },
92 { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, 93 { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
93 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 94 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
94 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_SELECT|BUTTON_PLAY, BUTTON_NONE }, 95 { ACTION_WPS_HOTKEY, BUTTON_SELECT|BUTTON_PLAY, BUTTON_NONE },
95 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 96 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
96 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 97 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
97 98
diff --git a/apps/keymaps/keymap-m3.c b/apps/keymaps/keymap-m3.c
index 4449d77068..b6968e6ff0 100644
--- a/apps/keymaps/keymap-m3.c
+++ b/apps/keymaps/keymap-m3.c
@@ -292,6 +292,7 @@ static const struct button_mapping button_context_tree[] = {
292 { ACTION_NONE, BUTTON_PLAY, BUTTON_NONE }, 292 { ACTION_NONE, BUTTON_PLAY, BUTTON_NONE },
293 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 293 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
294 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 294 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
295 { ACTION_TREE_HOTKEY, BUTTON_REC|BUTTON_MODE, BUTTON_REC },
295 296
296 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 297 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
297}; /* button_context_tree */ 298}; /* button_context_tree */
@@ -352,7 +353,7 @@ static const struct button_mapping button_context_wps[] = {
352 { ACTION_WPS_CONTEXT, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE }, 353 { ACTION_WPS_CONTEXT, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE },
353 { ACTION_WPS_MENU, BUTTON_REC|BUTTON_REL, BUTTON_REC }, 354 { ACTION_WPS_MENU, BUTTON_REC|BUTTON_REL, BUTTON_REC },
354 { ACTION_WPS_QUICKSCREEN, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC }, 355 { ACTION_WPS_QUICKSCREEN, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
355 { ACTION_WPS_VIEW_PLAYLIST,BUTTON_REC|BUTTON_MODE, BUTTON_REC }, 356 { ACTION_WPS_HOTKEY, BUTTON_REC|BUTTON_MODE, BUTTON_REC },
356 357
357 LAST_ITEM_IN_LIST 358 LAST_ITEM_IN_LIST
358}; /* button_context_wps */ 359}; /* button_context_wps */
diff --git a/apps/keymaps/keymap-meizu-m6sl.c b/apps/keymaps/keymap-meizu-m6sl.c
index 2dcb81bec0..c81b25729c 100644
--- a/apps/keymaps/keymap-meizu-m6sl.c
+++ b/apps/keymaps/keymap-meizu-m6sl.c
@@ -88,7 +88,11 @@ static const struct button_mapping button_context_wps[] = {
88 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE }, 88 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
89 89
90 { ACTION_WPS_PITCHSCREEN, BUTTON_PLAY|BUTTON_UP, BUTTON_PLAY }, 90 { ACTION_WPS_PITCHSCREEN, BUTTON_PLAY|BUTTON_UP, BUTTON_PLAY },
91#ifdef HAVE_HOTKEY
92 { ACTION_WPS_HOTKEY, BUTTON_PLAY|BUTTON_DOWN, BUTTON_PLAY },
93#else
91 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_PLAY|BUTTON_DOWN, BUTTON_PLAY }, 94 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_PLAY|BUTTON_DOWN, BUTTON_PLAY },
95#endif
92 96
93 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 97 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
94 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 98 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -114,6 +118,9 @@ static const struct button_mapping button_context_list[] = {
114static const struct button_mapping button_context_tree[] = { 118static const struct button_mapping button_context_tree[] = {
115 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 119 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
116 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE }, 120 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
121#ifdef HAVE_HOTKEY
122// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
123#endif
117 124
118 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 125 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
119}; /* button_context_tree */ 126}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-mini2440.c b/apps/keymaps/keymap-mini2440.c
index c53b9ae1c9..db145aa480 100644
--- a/apps/keymaps/keymap-mini2440.c
+++ b/apps/keymaps/keymap-mini2440.c
@@ -95,7 +95,11 @@ static const struct button_mapping button_context_wps[] = {
95 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 95 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE },
96 96
97 { ACTION_WPS_PITCHSCREEN, BUTTON_A|BUTTON_UP, BUTTON_A }, 97 { ACTION_WPS_PITCHSCREEN, BUTTON_A|BUTTON_UP, BUTTON_A },
98#ifdef HAVE_HOTKEY
99 { ACTION_WPS_HOTKEY, BUTTON_A|BUTTON_DOWN, BUTTON_NONE },
100#else
98 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_A|BUTTON_DOWN, BUTTON_NONE }, 101 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_A|BUTTON_DOWN, BUTTON_NONE },
102#endif
99 103
100 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 104 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
101 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 105 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
@@ -129,6 +133,9 @@ static const struct button_mapping button_context_tree[] = {
129 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 133 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
130 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 134 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
131 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 135 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
136#ifdef HAVE_HOTKEY
137// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
138#endif
132 139
133 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 140 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
134}; /* button_context_tree */ 141}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-mr100.c b/apps/keymaps/keymap-mr100.c
index dd2539f381..5a13f31402 100644
--- a/apps/keymaps/keymap-mr100.c
+++ b/apps/keymaps/keymap-mr100.c
@@ -94,7 +94,11 @@ static const struct button_mapping button_context_wps[] = {
94 { ACTION_WPS_ABSETA_PREVDIR,BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_NONE }, 94 { ACTION_WPS_ABSETA_PREVDIR,BUTTON_DISPLAY|BUTTON_LEFT, BUTTON_NONE },
95 { ACTION_WPS_ABRESET, BUTTON_DISPLAY|BUTTON_SELECT, BUTTON_NONE }, 95 { ACTION_WPS_ABRESET, BUTTON_DISPLAY|BUTTON_SELECT, BUTTON_NONE },
96 { ACTION_WPS_PITCHSCREEN, BUTTON_DISPLAY|BUTTON_UP, BUTTON_DISPLAY }, 96 { ACTION_WPS_PITCHSCREEN, BUTTON_DISPLAY|BUTTON_UP, BUTTON_DISPLAY },
97#ifdef HAVE_HOTKEY
98 { ACTION_WPS_HOTKEY, BUTTON_DISPLAY|BUTTON_DOWN, BUTTON_DISPLAY },
99#else
97 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_DISPLAY|BUTTON_DOWN, BUTTON_DISPLAY }, 100 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_DISPLAY|BUTTON_DOWN, BUTTON_DISPLAY },
101#endif
98 { ACTION_WPS_ID3SCREEN, BUTTON_DISPLAY|BUTTON_MENU, BUTTON_NONE }, 102 { ACTION_WPS_ID3SCREEN, BUTTON_DISPLAY|BUTTON_MENU, BUTTON_NONE },
99 103
100 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, 104 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
@@ -119,6 +123,9 @@ static const struct button_mapping button_context_tree[] = {
119 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE }, 123 { ACTION_TREE_STOP, BUTTON_POWER, BUTTON_NONE },
120 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, 124 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REL, BUTTON_POWER },
121 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, 125 { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE },
126#ifdef HAVE_HOTKEY
127// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
128#endif
122 129
123 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 130 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
124}; /* button_context_tree */ 131}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-player.c b/apps/keymaps/keymap-player.c
index 5fce6be83e..193413e473 100644
--- a/apps/keymaps/keymap-player.c
+++ b/apps/keymaps/keymap-player.c
@@ -63,7 +63,7 @@ static const struct button_mapping button_context_wps[] = {
63 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 63 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
64 { ACTION_WPS_ID3SCREEN, BUTTON_MENU|BUTTON_ON, BUTTON_NONE }, 64 { ACTION_WPS_ID3SCREEN, BUTTON_MENU|BUTTON_ON, BUTTON_NONE },
65 { ACTION_STD_KEYLOCK, BUTTON_MENU|BUTTON_STOP, BUTTON_NONE }, 65 { ACTION_STD_KEYLOCK, BUTTON_MENU|BUTTON_STOP, BUTTON_NONE },
66 { ACTION_WPS_VIEW_PLAYLIST,BUTTON_MENU|BUTTON_ON, BUTTON_NONE }, 66 { ACTION_WPS_HOTKEY, BUTTON_MENU|BUTTON_ON, BUTTON_NONE },
67 67
68 LAST_ITEM_IN_LIST 68 LAST_ITEM_IN_LIST
69}; 69};
@@ -79,6 +79,7 @@ static const struct button_mapping button_context_settings[] = {
79 79
80static const struct button_mapping button_context_tree[] = { 80static const struct button_mapping button_context_tree[] = {
81 { ACTION_TREE_WPS, BUTTON_ON, BUTTON_NONE }, 81 { ACTION_TREE_WPS, BUTTON_ON, BUTTON_NONE },
82 { ACTION_TREE_HOTKEY, BUTTON_MENU|BUTTON_ON, BUTTON_NONE },
82 83
83 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 84 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
84}; /* button_context_listtree */ 85}; /* button_context_listtree */
diff --git a/apps/keymaps/keymap-recorder.c b/apps/keymaps/keymap-recorder.c
index c2ac45e0d6..8b395e2700 100644
--- a/apps/keymaps/keymap-recorder.c
+++ b/apps/keymaps/keymap-recorder.c
@@ -76,7 +76,7 @@ static const struct button_mapping button_context_wps[] = {
76 { ACTION_WPS_MENU, BUTTON_F1|BUTTON_REL, BUTTON_F1 }, 76 { ACTION_WPS_MENU, BUTTON_F1|BUTTON_REL, BUTTON_F1 },
77 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 77 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
78 { ACTION_WPS_QUICKSCREEN, BUTTON_F2|BUTTON_REPEAT, BUTTON_NONE }, 78 { ACTION_WPS_QUICKSCREEN, BUTTON_F2|BUTTON_REPEAT, BUTTON_NONE },
79 { ACTION_WPS_VIEW_PLAYLIST,BUTTON_F2|BUTTON_REL, BUTTON_F2 }, 79 { ACTION_WPS_HOTKEY, BUTTON_F2|BUTTON_REL, BUTTON_F2 },
80 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON }, 80 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON },
81 { ACTION_WPS_ID3SCREEN, BUTTON_F1|BUTTON_ON, BUTTON_NONE }, 81 { ACTION_WPS_ID3SCREEN, BUTTON_F1|BUTTON_ON, BUTTON_NONE },
82 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP, BUTTON_ON }, 82 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP, BUTTON_ON },
@@ -107,6 +107,7 @@ static const struct button_mapping button_context_settings[] = {
107static const struct button_mapping button_context_tree[] = { 107static const struct button_mapping button_context_tree[] = {
108 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON }, 108 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON },
109 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE }, 109 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE },
110 { ACTION_TREE_HOTKEY, BUTTON_F2|BUTTON_REL, BUTTON_F2 },
110 { ACTION_NONE, BUTTON_ON, BUTTON_NONE }, 111 { ACTION_NONE, BUTTON_ON, BUTTON_NONE },
111 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP, BUTTON_ON }, 112 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP, BUTTON_ON },
112 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_ON|BUTTON_UP }, 113 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_ON|BUTTON_UP },
diff --git a/apps/keymaps/keymap-sa9200.c b/apps/keymaps/keymap-sa9200.c
index d7405588b5..3c98484b26 100644
--- a/apps/keymaps/keymap-sa9200.c
+++ b/apps/keymaps/keymap-sa9200.c
@@ -100,7 +100,11 @@ static const struct button_mapping button_context_wps[] = {
100 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 100 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
101 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 101 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
102 { ACTION_WPS_PITCHSCREEN, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE }, 102 { ACTION_WPS_PITCHSCREEN, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
103#ifdef HAVE_HOTKEY
104 { ACTION_WPS_HOTKEY, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
105#else
103 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT }, 106 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_NEXT|BUTTON_REL, BUTTON_NEXT },
107#endif
104 { ACTION_WPS_ID3SCREEN, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE }, 108 { ACTION_WPS_ID3SCREEN, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
105 109
106 LAST_ITEM_IN_LIST 110 LAST_ITEM_IN_LIST
@@ -124,6 +128,9 @@ static const struct button_mapping button_context_list[] = {
124static const struct button_mapping button_context_tree[] = { 128static const struct button_mapping button_context_tree[] = {
125 { ACTION_TREE_WPS, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE }, 129 { ACTION_TREE_WPS, BUTTON_PREV|BUTTON_REPEAT, BUTTON_NONE },
126 { ACTION_TREE_STOP, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE }, 130 { ACTION_TREE_STOP, BUTTON_NEXT|BUTTON_REPEAT, BUTTON_NONE },
131#ifdef HAVE_HOTKEY
132// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
133#endif
127 134
128 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 135 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
129}; /* button_context_tree */ 136}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-touchscreen.c b/apps/keymaps/keymap-touchscreen.c
index 6d3a515da7..8c2397f48c 100644
--- a/apps/keymaps/keymap-touchscreen.c
+++ b/apps/keymaps/keymap-touchscreen.c
@@ -92,7 +92,11 @@ static const struct button_mapping button_context_wps[] = {
92 92
93 { ACTION_WPS_MENU, BUTTON_TOPLEFT|BUTTON_REL, BUTTON_TOPLEFT }, 93 { ACTION_WPS_MENU, BUTTON_TOPLEFT|BUTTON_REL, BUTTON_TOPLEFT },
94 { ACTION_WPS_QUICKSCREEN, BUTTON_BOTTOMLEFT|BUTTON_REL, BUTTON_BOTTOMLEFT }, 94 { ACTION_WPS_QUICKSCREEN, BUTTON_BOTTOMLEFT|BUTTON_REL, BUTTON_BOTTOMLEFT },
95#ifdef HAVE_HOTKEY
96 { ACTION_WPS_HOTKEY, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT },
97#else
95 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT }, 98 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT },
99#endif
96 { ACTION_WPS_REC, BUTTON_TOPLEFT|BUTTON_REPEAT, BUTTON_TOPLEFT }, 100 { ACTION_WPS_REC, BUTTON_TOPLEFT|BUTTON_REPEAT, BUTTON_TOPLEFT },
97 { ACTION_WPS_PITCHSCREEN, BUTTON_BOTTOMLEFT|BUTTON_REPEAT, BUTTON_BOTTOMLEFT }, 101 { ACTION_WPS_PITCHSCREEN, BUTTON_BOTTOMLEFT|BUTTON_REPEAT, BUTTON_BOTTOMLEFT },
98 { ACTION_WPS_ID3SCREEN, BUTTON_BOTTOMRIGHT|BUTTON_REPEAT, BUTTON_BOTTOMRIGHT }, 102 { ACTION_WPS_ID3SCREEN, BUTTON_BOTTOMRIGHT|BUTTON_REPEAT, BUTTON_BOTTOMRIGHT },
@@ -122,6 +126,9 @@ static const struct button_mapping button_context_list[] = {
122static const struct button_mapping button_context_tree[] = { 126static const struct button_mapping button_context_tree[] = {
123 { ACTION_TREE_WPS, BUTTON_TOPRIGHT|BUTTON_REL, BUTTON_TOPRIGHT }, 127 { ACTION_TREE_WPS, BUTTON_TOPRIGHT|BUTTON_REL, BUTTON_TOPRIGHT },
124 { ACTION_TREE_STOP, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT }, 128 { ACTION_TREE_STOP, BUTTON_BOTTOMRIGHT|BUTTON_REL, BUTTON_BOTTOMRIGHT },
129#ifdef HAVE_HOTKEY
130// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
131#endif
125 132
126 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_CUSTOM|CONTEXT_TREE) 133 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM2|CONTEXT_CUSTOM|CONTEXT_TREE)
127}; /* button_context_tree */ 134}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-vibe500.c b/apps/keymaps/keymap-vibe500.c
index 0a4cf83921..ae0756d1d3 100644
--- a/apps/keymaps/keymap-vibe500.c
+++ b/apps/keymaps/keymap-vibe500.c
@@ -66,7 +66,11 @@ static const struct button_mapping button_context_wps[] = {
66 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE }, 66 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
67 { ACTION_WPS_BROWSE, BUTTON_OK|BUTTON_REL, BUTTON_OK }, 67 { ACTION_WPS_BROWSE, BUTTON_OK|BUTTON_REL, BUTTON_OK },
68 { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, 68 { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
69#ifdef HAVE_HOTKEY
70 { ACTION_WPS_HOTKEY, BUTTON_CANCEL, BUTTON_NONE },
71#else
69 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_CANCEL, BUTTON_NONE }, 72 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_CANCEL, BUTTON_NONE },
73#endif
70 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, 74 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
71 { ACTION_WPS_QUICKSCREEN, BUTTON_OK|BUTTON_REPEAT, BUTTON_OK }, 75 { ACTION_WPS_QUICKSCREEN, BUTTON_OK|BUTTON_REPEAT, BUTTON_OK },
72 76
@@ -76,6 +80,9 @@ static const struct button_mapping button_context_wps[] = {
76static const struct button_mapping button_context_tree[] = { 80static const struct button_mapping button_context_tree[] = {
77 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 81 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
78 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 82 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
83#ifdef HAVE_HOTKEY
84// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
85#endif
79 86
80 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 87 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
81}; /* button_context_tree */ 88}; /* button_context_tree */
diff --git a/apps/keymaps/keymap-yh8xx_yh9xx.c b/apps/keymaps/keymap-yh8xx_yh9xx.c
index 7ae787a291..c64263d809 100644
--- a/apps/keymaps/keymap-yh8xx_yh9xx.c
+++ b/apps/keymaps/keymap-yh8xx_yh9xx.c
@@ -96,7 +96,11 @@ static const struct button_mapping button_context_wps[] = {
96 { ACTION_WPS_QUICKSCREEN, BUTTON_LEFT|BUTTON_DOWN|BUTTON_REPEAT, 96 { ACTION_WPS_QUICKSCREEN, BUTTON_LEFT|BUTTON_DOWN|BUTTON_REPEAT,
97 BUTTON_LEFT|BUTTON_DOWN|BUTTON_REPEAT }, 97 BUTTON_LEFT|BUTTON_DOWN|BUTTON_REPEAT },
98 98
99#ifdef HAVE_HOTKEY
100 { ACTION_WPS_HOTKEY, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
101#else
99 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT }, 102 { ACTION_WPS_VIEW_PLAYLIST, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
103#endif
100 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE }, 104 { ACTION_WPS_REC, BUTTON_REC|BUTTON_REPEAT, BUTTON_NONE },
101 105
102 LAST_ITEM_IN_LIST 106 LAST_ITEM_IN_LIST
@@ -117,6 +121,9 @@ static const struct button_mapping button_context_list[] = {
117static const struct button_mapping button_context_tree[] = { 121static const struct button_mapping button_context_tree[] = {
118 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, 122 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
119 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, 123 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
124#ifdef HAVE_HOTKEY
125// { ACTION_TREE_HOTKEY, BUTTON_NONE, BUTTON_NONE },
126#endif
120 127
121 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) 128 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
122}; /* button_context_tree */ 129}; /* button_context_tree */
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 60bf9902c7..b64ab859ec 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -13394,3 +13394,71 @@
13394 lineout_poweroff: "Line Out" 13394 lineout_poweroff: "Line Out"
13395 </voice> 13395 </voice>
13396</phrase> 13396</phrase>
13397<phrase>
13398 id: LANG_SET_HOTKEY
13399 desc: hotkey splash
13400 user: core
13401 <source>
13402 *: none
13403 hotkey: "Set Hotkey: %s"
13404 </source>
13405 <dest>
13406 *: none
13407 hotkey: "Set Hotkey: %s"
13408 </dest>
13409 <voice>
13410 *: none
13411 hotkey: "Set Hotkey: %s"
13412 </voice>
13413</phrase>
13414<phrase>
13415 id: LANG_HOTKEY_NOT_SET
13416 desc: hotkey splash
13417 user: core
13418 <source>
13419 *: none
13420 hotkey: "Hotkey Not Set"
13421 </source>
13422 <dest>
13423 *: none
13424 hotkey: "Hotkey Not Set"
13425 </dest>
13426 <voice>
13427 *: none
13428 hotkey: "Hotkey Not Set"
13429 </voice>
13430</phrase>
13431<phrase>
13432 id: LANG_HOTKEY
13433 desc: hotkey menu
13434 user: core
13435 <source>
13436 *: none
13437 hotkey: "Hotkey"
13438 </source>
13439 <dest>
13440 *: none
13441 hotkey: "Hotkey"
13442 </dest>
13443 <voice>
13444 *: none
13445 hotkey: "Hotkey"
13446 </voice>
13447</phrase>
13448<phrase>
13449 id: LANG_VIEW_HOTKEY
13450 desc: hotkey menu
13451 user: core
13452 <source>
13453 *: none
13454 hotkey: "View Hotkey Settings"
13455 </source>
13456 <dest>
13457 *: none
13458 hotkey: "View Hotkey Settings"
13459 </dest>
13460 <voice>
13461 *: none
13462 hotkey: "View Hotkey Settings"
13463 </voice>
13464</phrase>
diff --git a/apps/menu.c b/apps/menu.c
index 670a235202..b640905c0f 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -61,6 +61,12 @@
61#include "list.h" 61#include "list.h"
62#include "buttonbar.h" 62#include "buttonbar.h"
63 63
64/* hotkey settings */
65#ifdef HAVE_HOTKEY
66const struct menu_item_ex *selected_menu_item;
67bool hotkey_settable_menu = false;
68#endif
69
64#define MAX_MENUS 8 70#define MAX_MENUS 8
65/* used to allow for dynamic menus */ 71/* used to allow for dynamic menus */
66#define MAX_MENU_SUBITEMS 64 72#define MAX_MENU_SUBITEMS 64
@@ -426,6 +432,17 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
426 done = true; 432 done = true;
427 } 433 }
428#endif 434#endif
435#ifdef HAVE_HOTKEY
436 else if (hotkey_settable_menu &&
437 ((action == ACTION_WPS_HOTKEY) ||
438 (action == ACTION_TREE_HOTKEY)))
439 {
440 ret = MENU_SELECTED_HOTKEY;
441 done = true;
442 selected = get_menu_selection(gui_synclist_get_sel_pos(&lists),menu);
443 selected_menu_item = menu->submenus[selected];
444 }
445#endif
429 else if (action == ACTION_TREE_WPS) 446 else if (action == ACTION_TREE_WPS)
430 { 447 {
431 ret = GO_TO_PREVIOUS_MUSIC; 448 ret = GO_TO_PREVIOUS_MUSIC;
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index b695d9265b..8a83a3b240 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -47,6 +47,10 @@
47#ifdef HAVE_DIRCACHE 47#ifdef HAVE_DIRCACHE
48#include "dircache.h" 48#include "dircache.h"
49#endif 49#endif
50#ifdef HAVE_HOTKEY
51#include "list.h"
52#include "settings_list.h"
53#endif
50 54
51/***********************************/ 55/***********************************/
52/* TAGCACHE MENU */ 56/* TAGCACHE MENU */
@@ -400,6 +404,58 @@ MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice,
400 404
401 405
402/***********************************/ 406/***********************************/
407/* HOTKEY MENU */
408#ifdef HAVE_HOTKEY
409static void view_hotkey_info(void)
410{
411 struct simplelist_info info;
412 simplelist_info_init(&info, str(LANG_VIEW_HOTKEY), 0, NULL);
413 info.hide_selection = true;
414 simplelist_set_line_count(2);
415 simplelist_addline(0, "WPS: %s",
416 str(global_settings.hotkey_wps_desc_id));
417 simplelist_addline(1, "Tree: %s",
418 str(global_settings.hotkey_tree_desc_id));
419 simplelist_show_list(&info);
420}
421
422/* reset hotkey settings to their defaults */
423static void reset_hotkey_settings(void)
424{
425 void *vars[] = {
426 &global_settings.hotkey_tree,
427 &global_settings.hotkey_tree_desc_id,
428 &global_settings.hotkey_wps,
429 &global_settings.hotkey_wps_desc_id,
430 };
431 const int num_settings = sizeof(vars) / sizeof(vars[0]);
432 int i;
433
434 for (i = 0; i < num_settings; i++)
435 {
436 const struct settings_list *setting =
437 find_setting(vars[i], NULL);
438 reset_setting(setting, setting->setting);
439 }
440
441 settings_save();
442 splash(HZ, str(LANG_RESET_DONE_CLEAR));
443}
444
445MENUITEM_FUNCTION(hotkey_view, 0, ID2P(LANG_VIEW_HOTKEY),
446 (int(*)(void))view_hotkey_info, NULL,
447 NULL, Icon_NOICON);
448MENUITEM_FUNCTION(hotkey_reset, 0, ID2P(LANG_RESET),
449 (int(*)(void))reset_hotkey_settings, NULL,
450 NULL, Icon_NOICON);
451MAKE_MENU(hotkey_menu, ID2P(LANG_HOTKEY), 0, Icon_NOICON,
452 &hotkey_view, &hotkey_reset);
453#endif /*have_hotkey */
454/* HOTKEY MENU */
455/***********************************/
456
457
458/***********************************/
403/* SETTINGS MENU */ 459/* SETTINGS MENU */
404static int language_browse(void) 460static int language_browse(void)
405{ 461{
@@ -415,7 +471,10 @@ MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0,
415 &tagcache_menu, 471 &tagcache_menu,
416#endif 472#endif
417 &display_menu, &system_menu, 473 &display_menu, &system_menu,
418 &bookmark_settings_menu, &browse_langs, &voice_settings_menu 474 &bookmark_settings_menu, &browse_langs, &voice_settings_menu,
475#ifdef HAVE_HOTKEY
476 &hotkey_menu,
477#endif
419 ); 478 );
420/* SETTINGS MENU */ 479/* SETTINGS MENU */
421/***********************************/ 480/***********************************/
diff --git a/apps/onplay.c b/apps/onplay.c
index f9c75ab253..5a28c53cd4 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -528,7 +528,7 @@ static int remove_dir(char* dirname, int len)
528 528
529 529
530/* share code for file and directory deletion, saves space */ 530/* share code for file and directory deletion, saves space */
531static bool delete_handler(bool is_dir) 531static bool delete_file_dir(void)
532{ 532{
533 char file_to_delete[MAX_PATH]; 533 char file_to_delete[MAX_PATH];
534 strcpy(file_to_delete, selected_file); 534 strcpy(file_to_delete, selected_file);
@@ -551,7 +551,7 @@ static bool delete_handler(bool is_dir)
551 splash(0, str(LANG_DELETING)); 551 splash(0, str(LANG_DELETING));
552 552
553 int res; 553 int res;
554 if (is_dir) 554 if (selected_file_attr & ATTR_DIRECTORY) /* true if directory */
555 { 555 {
556 char pathname[MAX_PATH]; /* space to go deep */ 556 char pathname[MAX_PATH]; /* space to go deep */
557 cpu_boost(true); 557 cpu_boost(true);
@@ -568,16 +568,6 @@ static bool delete_handler(bool is_dir)
568 return (res == 0); 568 return (res == 0);
569} 569}
570 570
571static bool delete_file(void)
572{
573 return delete_handler(false);
574}
575
576static bool delete_dir(void)
577{
578 return delete_handler(true);
579}
580
581static bool rename_file(void) 571static bool rename_file(void)
582{ 572{
583 char newname[MAX_PATH]; 573 char newname[MAX_PATH];
@@ -988,9 +978,9 @@ MENUITEM_FUNCTION(clipboard_copy_item, 0, ID2P(LANG_COPY),
988MENUITEM_FUNCTION(clipboard_paste_item, 0, ID2P(LANG_PASTE), 978MENUITEM_FUNCTION(clipboard_paste_item, 0, ID2P(LANG_PASTE),
989 clipboard_paste, NULL, clipboard_callback, Icon_NOICON); 979 clipboard_paste, NULL, clipboard_callback, Icon_NOICON);
990MENUITEM_FUNCTION(delete_file_item, 0, ID2P(LANG_DELETE), 980MENUITEM_FUNCTION(delete_file_item, 0, ID2P(LANG_DELETE),
991 delete_file, NULL, clipboard_callback, Icon_NOICON); 981 delete_file_dir, NULL, clipboard_callback, Icon_NOICON);
992MENUITEM_FUNCTION(delete_dir_item, 0, ID2P(LANG_DELETE_DIR), 982MENUITEM_FUNCTION(delete_dir_item, 0, ID2P(LANG_DELETE_DIR),
993 delete_dir, NULL, clipboard_callback, Icon_NOICON); 983 delete_file_dir, NULL, clipboard_callback, Icon_NOICON);
994MENUITEM_FUNCTION(create_dir_item, 0, ID2P(LANG_CREATE_DIR), 984MENUITEM_FUNCTION(create_dir_item, 0, ID2P(LANG_CREATE_DIR),
995 create_dir, NULL, clipboard_callback, Icon_NOICON); 985 create_dir, NULL, clipboard_callback, Icon_NOICON);
996 986
@@ -1180,19 +1170,205 @@ static int onplaymenu_callback(int action,const struct menu_item_ex *this_item)
1180 } 1170 }
1181 return action; 1171 return action;
1182} 1172}
1183int onplay(char* file, int attr, int from) 1173
1174#ifdef HAVE_HOTKEY
1175/* direct function calls, no need for menu callbacks */
1176static bool delete_item(void)
1177{
1178#ifdef HAVE_MULTIVOLUME
1179 /* no delete for volumes */
1180 if ((selected_file_attr & FAT_ATTR_VOLUME) ||
1181 (selected_file_attr & ATTR_VOLUME))
1182 return false;
1183#endif
1184 return delete_file_dir();
1185}
1186
1187static bool open_with(void)
1188{
1189 /* only open files */
1190 if (selected_file_attr & ATTR_DIRECTORY)
1191 return false;
1192#ifdef HAVE_MULTIVOLUME
1193 if (selected_file_attr & ATTR_VOLUME)
1194 return false;
1195#endif
1196 return list_viewers();
1197}
1198
1199extern const struct menu_item_ex *selected_menu_item;
1200extern bool hotkey_settable_menu;
1201
1202#define HOT_MASK 0x0FF
1203#define HOT_WPS 0x100
1204#define HOT_TREE 0x200
1205
1206struct hotkey_assignment {
1207 int item;
1208 struct menu_func func;
1209 int return_code;
1210 const struct menu_item_ex *menu_addr;
1211};
1212
1213#define HOTKEY_FUNC(func, param) {{(void *)func}, param}
1214
1215/* Any desired hotkey functions go here... */
1216enum hotkey_settings {
1217 HOTKEY_OFF = 0,
1218 HOTKEY_VIEW_PLAYLIST = 1,
1219 HOTKEY_SHOW_TRACK_INFO,
1220 HOTKEY_PITCHSCREEN,
1221 HOTKEY_OPEN_WITH,
1222 HOTKEY_DELETE,
1223 HOTKEY_INSERT,
1224};
1225
1226/* ... and here. Order is not important. */
1227static struct hotkey_assignment hotkey_items[] = {
1228 { HOTKEY_VIEW_PLAYLIST | HOT_WPS,
1229 HOTKEY_FUNC(NULL, NULL),
1230 ONPLAY_PLAYLIST, &view_cur_playlist },
1231 { HOTKEY_SHOW_TRACK_INFO| HOT_WPS,
1232 HOTKEY_FUNC(browse_id3, NULL),
1233 ONPLAY_RELOAD_DIR, &browse_id3_item },
1234#ifdef HAVE_PITCHSCREEN
1235 { HOTKEY_PITCHSCREEN | HOT_WPS,
1236 HOTKEY_FUNC(gui_syncpitchscreen_run, NULL),
1237 ONPLAY_RELOAD_DIR, &pitch_screen_item },
1238#endif
1239 { HOTKEY_OPEN_WITH | HOT_WPS | HOT_TREE,
1240 HOTKEY_FUNC(open_with, NULL),
1241 ONPLAY_RELOAD_DIR, &list_viewers_item },
1242 { HOTKEY_DELETE | HOT_WPS | HOT_TREE,
1243 HOTKEY_FUNC(delete_item, NULL),
1244 ONPLAY_RELOAD_DIR, &delete_file_item },
1245 { HOTKEY_DELETE | HOT_TREE,
1246 HOTKEY_FUNC(delete_item, NULL),
1247 ONPLAY_RELOAD_DIR, &delete_dir_item },
1248 { HOTKEY_INSERT | HOT_TREE,
1249 HOTKEY_FUNC(playlist_insert_func, (intptr_t*)PLAYLIST_INSERT),
1250 ONPLAY_START_PLAY, &i_pl_item },
1251};
1252
1253static const int num_hotkey_items = sizeof(hotkey_items) / sizeof(hotkey_items[0]);
1254
1255/* Execute the hotkey function, if listed for this screen */
1256static int execute_hotkey(bool is_wps)
1257{
1258 int i;
1259 struct hotkey_assignment *this_item;
1260 const int context = is_wps ? HOT_WPS : HOT_TREE;
1261 const int this_hotkey = (is_wps ? global_settings.hotkey_wps :
1262 global_settings.hotkey_tree);
1263
1264 /* search assignment struct for a match for the hotkey setting */
1265 for (i = 0; i < num_hotkey_items; i++)
1266 {
1267 this_item = &hotkey_items[i];
1268 if ((this_item->item & context) &&
1269 ((this_item->item & HOT_MASK) == this_hotkey))
1270 {
1271 /* run the associated function (with optional param), if any */
1272 const struct menu_func func = this_item->func;
1273 if (func.function != NULL)
1274 {
1275 if (func.param != NULL)
1276 (*(func.function_w_param))(func.param);
1277 else
1278 (*(func.function))();
1279 }
1280 /* return with the associated code */
1281 return this_item->return_code;
1282 }
1283 }
1284
1285 /* no valid hotkey set */
1286 splash(HZ, ID2P(LANG_HOTKEY_NOT_SET));
1287 return ONPLAY_RELOAD_DIR;
1288}
1289
1290/* Set the hotkey to the current context menu function, if listed */
1291static void set_hotkey(bool is_wps)
1292{
1293 int i;
1294 struct hotkey_assignment *this_item;
1295 const int context = is_wps ? HOT_WPS : HOT_TREE;
1296 int *hk_func = is_wps ? &global_settings.hotkey_wps :
1297 &global_settings.hotkey_tree,
1298 *hk_desc = is_wps ? &global_settings.hotkey_wps_desc_id :
1299 &global_settings.hotkey_tree_desc_id;
1300 int this_hk,
1301 this_id;
1302 bool match_found = false;
1303
1304 /* search assignment struct for a function that matches the current menu item */
1305 for (i = 0; i < num_hotkey_items; i++)
1306 {
1307 this_item = &hotkey_items[i];
1308 if ((this_item->item & context) &&
1309 (this_item->menu_addr == selected_menu_item))
1310 {
1311 this_hk = this_item->item & HOT_MASK;
1312 this_id = P2ID((selected_menu_item->callback_and_desc)->desc);
1313 match_found = true;
1314 break;
1315 }
1316 }
1317
1318 /* ignore the hotkey if no match found or no change to setting */
1319 if (!match_found || (this_hk == *hk_func)) return;
1320
1321 char line1_buf[100];
1322 char line2_buf[101];
1323 char *line1 = line1_buf;
1324 char *line2 = line2_buf;
1325 char **line1_ptr = &line1;
1326 char **line2_ptr = &line2;
1327 const struct text_message message={(const char **)line2_ptr, 1};
1328 const struct text_message yes_message={(const char **)line1_ptr, 1};
1329
1330 snprintf(line1, 100, str(LANG_SET_HOTKEY), str(this_id));
1331 strcat(strcpy(line2, line1), "?");
1332
1333 /* confirm the hotkey setting change */
1334 if(gui_syncyesno_run(&message, &yes_message, NULL)==YESNO_YES)
1335 {
1336 /* store the hotkey settings */
1337 *hk_func = this_hk;
1338 *hk_desc = this_id;
1339
1340 settings_save();
1341 splash(HZ*2, line1);
1342 }
1343}
1344#endif /* HOTKEY */
1345
1346int onplay(char* file, int attr, int from, bool hotkey)
1184{ 1347{
1185 const struct menu_item_ex *menu; 1348 const struct menu_item_ex *menu;
1186 onplay_result = ONPLAY_OK; 1349 onplay_result = ONPLAY_OK;
1187 context = from; 1350 context = from;
1188 selected_file = file; 1351 selected_file = file;
1189 selected_file_attr = attr; 1352 selected_file_attr = attr;
1353#ifdef HAVE_HOTKEY
1354 if (hotkey)
1355 return execute_hotkey(context == CONTEXT_WPS);
1356 hotkey_settable_menu = true;
1357#else
1358 (void)hotkey;
1359#endif
1190 if (context == CONTEXT_WPS) 1360 if (context == CONTEXT_WPS)
1191 menu = &wps_onplay_menu; 1361 menu = &wps_onplay_menu;
1192 else 1362 else
1193 menu = &tree_onplay_menu; 1363 menu = &tree_onplay_menu;
1194 switch (do_menu(menu, NULL, NULL, false)) 1364 switch (do_menu(menu, NULL, NULL, false))
1195 { 1365 {
1366#ifdef HAVE_HOTKEY
1367 hotkey_settable_menu = false;
1368 case MENU_SELECTED_HOTKEY:
1369 set_hotkey(context == CONTEXT_WPS);
1370 return ONPLAY_RELOAD_DIR;
1371#endif
1196 case GO_TO_WPS: 1372 case GO_TO_WPS:
1197 return ONPLAY_START_PLAY; 1373 return ONPLAY_START_PLAY;
1198 case GO_TO_ROOT: 1374 case GO_TO_ROOT:
diff --git a/apps/onplay.h b/apps/onplay.h
index b0f1a187a3..4eb7c823b8 100644
--- a/apps/onplay.h
+++ b/apps/onplay.h
@@ -21,7 +21,7 @@
21#ifndef _ONPLAY_H_ 21#ifndef _ONPLAY_H_
22#define _ONPLAY_H_ 22#define _ONPLAY_H_
23 23
24int onplay(char* file, int attr, int from_screen); 24int onplay(char* file, int attr, int from_screen, bool hotkey);
25 25
26enum { 26enum {
27 ONPLAY_MAINMENU = -1, 27 ONPLAY_MAINMENU = -1,
diff --git a/apps/playlist_catalog.c b/apps/playlist_catalog.c
index c5d4df0684..44fd42f7f2 100644
--- a/apps/playlist_catalog.c
+++ b/apps/playlist_catalog.c
@@ -281,7 +281,7 @@ static int display_playlists(char* playlist, bool view)
281 sel_file); 281 sel_file);
282 282
283 if (onplay(playlist, FILE_ATTR_M3U, 283 if (onplay(playlist, FILE_ATTR_M3U,
284 CONTEXT_TREE) != ONPLAY_OK) 284 CONTEXT_TREE, false) != ONPLAY_OK)
285 { 285 {
286 result = 0; 286 result = 0;
287 exit = true; 287 exit = true;
diff --git a/apps/root_menu.h b/apps/root_menu.h
index 4113b64495..d3ef817d5b 100644
--- a/apps/root_menu.h
+++ b/apps/root_menu.h
@@ -53,6 +53,7 @@ enum {
53 GO_TO_BROWSEPLUGINS, 53 GO_TO_BROWSEPLUGINS,
54 GO_TO_TIMESCREEN, 54 GO_TO_TIMESCREEN,
55 GO_TO_PLAYLIST_VIEWER, 55 GO_TO_PLAYLIST_VIEWER,
56 MENU_SELECTED_HOTKEY,
56}; 57};
57 58
58extern const struct menu_item_ex root_menu_; 59extern const struct menu_item_ex root_menu_;
diff --git a/apps/settings.h b/apps/settings.h
index 62f85254aa..029f056da7 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -816,6 +816,13 @@ struct user_settings
816 bool morse_input; /* text input method setting */ 816 bool morse_input; /* text input method setting */
817#endif 817#endif
818 818
819#ifdef HAVE_HOTKEY
820 int hotkey_wps;
821 int hotkey_wps_desc_id;
822 int hotkey_tree;
823 int hotkey_tree_desc_id;
824#endif
825
819}; 826};
820 827
821/** global variables **/ 828/** global variables **/
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 2638eac5a0..2492178577 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1660,6 +1660,13 @@ const struct settings_list settings[] = {
1660#ifdef HAVE_MORSE_INPUT 1660#ifdef HAVE_MORSE_INPUT
1661 OFFON_SETTING(0, morse_input, LANG_MORSE_INPUT, false, "morse input", NULL), 1661 OFFON_SETTING(0, morse_input, LANG_MORSE_INPUT, false, "morse input", NULL),
1662#endif 1662#endif
1663
1664#ifdef HAVE_HOTKEY
1665 CHOICE_SETTING(0, hotkey_wps, 0, 1, "hotkey wps", 0, NULL, 0),
1666 CHOICE_SETTING(0, hotkey_wps_desc_id, 0, LANG_VIEW_DYNAMIC_PLAYLIST, "hotkey wps desc id", 0, NULL, 0),
1667 CHOICE_SETTING(0, hotkey_tree, 0, 0, "hotkey tree", 0, NULL, 0),
1668 CHOICE_SETTING(0, hotkey_tree_desc_id, 0, LANG_OFF, "hotkey tree desc id", 0, NULL, 0),
1669#endif
1663}; 1670};
1664 1671
1665const int nb_settings = sizeof(settings)/sizeof(*settings); 1672const int nb_settings = sizeof(settings)/sizeof(*settings);
diff --git a/apps/tree.c b/apps/tree.c
index 9053dcfcdb..c8234d5e97 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -757,12 +757,14 @@ static int dirbrowse()
757#endif 757#endif
758 758
759 case ACTION_STD_CONTEXT: 759 case ACTION_STD_CONTEXT:
760 case ACTION_TREE_HOTKEY:
760 { 761 {
762 bool hotkey = button == ACTION_TREE_HOTKEY;
761 int onplay_result; 763 int onplay_result;
762 int attr = 0; 764 int attr = 0;
763 765
764 if(!numentries) 766 if(!numentries)
765 onplay_result = onplay(NULL, 0, curr_context); 767 onplay_result = onplay(NULL, 0, curr_context, hotkey);
766 else { 768 else {
767#ifdef HAVE_TAGCACHE 769#ifdef HAVE_TAGCACHE
768 if (id3db) 770 if (id3db)
@@ -788,7 +790,7 @@ static int dirbrowse()
788 snprintf(buf, sizeof buf, "/%s", 790 snprintf(buf, sizeof buf, "/%s",
789 dircache[tc.selected_item].name); 791 dircache[tc.selected_item].name);
790 } 792 }
791 onplay_result = onplay(buf, attr, curr_context); 793 onplay_result = onplay(buf, attr, curr_context, hotkey);
792 } 794 }
793 switch (onplay_result) 795 switch (onplay_result)
794 { 796 {
diff --git a/firmware/export/config/archosfmrecorder.h b/firmware/export/config/archosfmrecorder.h
index d9f3a95f3e..b64cc2db01 100644
--- a/firmware/export/config/archosfmrecorder.h
+++ b/firmware/export/config/archosfmrecorder.h
@@ -140,3 +140,5 @@
140#define MIN_CONTRAST_SETTING 5 140#define MIN_CONTRAST_SETTING 5
141#define MAX_CONTRAST_SETTING 63 141#define MAX_CONTRAST_SETTING 63
142 142
143/* Define this if a programmable hotkey is mapped */
144#define HAVE_HOTKEY
diff --git a/firmware/export/config/archosondiofm.h b/firmware/export/config/archosondiofm.h
index c49f11a473..39133ad789 100644
--- a/firmware/export/config/archosondiofm.h
+++ b/firmware/export/config/archosondiofm.h
@@ -140,3 +140,5 @@
140#define MIN_CONTRAST_SETTING 5 140#define MIN_CONTRAST_SETTING 5
141#define MAX_CONTRAST_SETTING 63 141#define MAX_CONTRAST_SETTING 63
142 142
143/* Define this if a programmable hotkey is mapped */
144//#define HAVE_HOTKEY
diff --git a/firmware/export/config/archosondiosp.h b/firmware/export/config/archosondiosp.h
index 867bc1358c..0dac0b2a61 100644
--- a/firmware/export/config/archosondiosp.h
+++ b/firmware/export/config/archosondiosp.h
@@ -124,3 +124,5 @@
124#define MIN_CONTRAST_SETTING 5 124#define MIN_CONTRAST_SETTING 5
125#define MAX_CONTRAST_SETTING 63 125#define MAX_CONTRAST_SETTING 63
126 126
127/* Define this if a programmable hotkey is mapped */
128//#define HAVE_HOTKEY
diff --git a/firmware/export/config/archosplayer.h b/firmware/export/config/archosplayer.h
index c60ee6a071..f5e120efef 100644
--- a/firmware/export/config/archosplayer.h
+++ b/firmware/export/config/archosplayer.h
@@ -103,3 +103,5 @@
103 103
104#define HAVE_SERIAL 104#define HAVE_SERIAL
105 105
106/* Define this if a programmable hotkey is mapped */
107#define HAVE_HOTKEY
diff --git a/firmware/export/config/archosrecorder.h b/firmware/export/config/archosrecorder.h
index 9a4b14ac9b..38141e3342 100644
--- a/firmware/export/config/archosrecorder.h
+++ b/firmware/export/config/archosrecorder.h
@@ -134,3 +134,5 @@
134#define MAX_CONTRAST_SETTING 63 134#define MAX_CONTRAST_SETTING 63
135 135
136#define HAVE_SERIAL 136#define HAVE_SERIAL
137/* Define this if a programmable hotkey is mapped */
138#define HAVE_HOTKEY
diff --git a/firmware/export/config/archosrecorderv2.h b/firmware/export/config/archosrecorderv2.h
index c530fa5815..08ee6e83af 100644
--- a/firmware/export/config/archosrecorderv2.h
+++ b/firmware/export/config/archosrecorderv2.h
@@ -140,3 +140,5 @@
140#define MIN_CONTRAST_SETTING 5 140#define MIN_CONTRAST_SETTING 5
141#define MAX_CONTRAST_SETTING 63 141#define MAX_CONTRAST_SETTING 63
142 142
143/* Define this if a programmable hotkey is mapped */
144#define HAVE_HOTKEY
diff --git a/firmware/export/config/cowond2.h b/firmware/export/config/cowond2.h
index 465fe7a43b..5b9ee0d861 100644
--- a/firmware/export/config/cowond2.h
+++ b/firmware/export/config/cowond2.h
@@ -169,3 +169,5 @@
169#define BOOTFILE "rockbox." BOOTFILE_EXT 169#define BOOTFILE "rockbox." BOOTFILE_EXT
170#define BOOTDIR "/.rockbox" 170#define BOOTDIR "/.rockbox"
171 171
172/* Define this if a programmable hotkey is mapped */
173//#define HAVE_HOTKEY
diff --git a/firmware/export/config/creativezv.h b/firmware/export/config/creativezv.h
index eff5a506c0..5bd8c9fd11 100644
--- a/firmware/export/config/creativezv.h
+++ b/firmware/export/config/creativezv.h
@@ -165,3 +165,5 @@
165#define USB_PRODUCT_ID 0x4133 165#define USB_PRODUCT_ID 0x4133
166#define USB_NUM_ENDPOINTS 7 166#define USB_NUM_ENDPOINTS 7
167 167
168/* Define this if a programmable hotkey is mapped */
169//#define HAVE_HOTKEY
diff --git a/firmware/export/config/gigabeatfx.h b/firmware/export/config/gigabeatfx.h
index 363312a415..71d949ae53 100644
--- a/firmware/export/config/gigabeatfx.h
+++ b/firmware/export/config/gigabeatfx.h
@@ -186,3 +186,5 @@
186#define BOOTFILE "rockbox." BOOTFILE_EXT 186#define BOOTFILE "rockbox." BOOTFILE_EXT
187#define BOOTDIR "/.rockbox" 187#define BOOTDIR "/.rockbox"
188 188
189/* Define this if a programmable hotkey is mapped */
190//#define HAVE_HOTKEY
diff --git a/firmware/export/config/gigabeats.h b/firmware/export/config/gigabeats.h
index 7f55797a07..253cd6b46d 100644
--- a/firmware/export/config/gigabeats.h
+++ b/firmware/export/config/gigabeats.h
@@ -214,3 +214,5 @@
214#define BOOTFILE "rockbox." BOOTFILE_EXT 214#define BOOTFILE "rockbox." BOOTFILE_EXT
215#define BOOTDIR "/.rockbox" 215#define BOOTDIR "/.rockbox"
216 216
217/* Define this if a programmable hotkey is mapped */
218//#define HAVE_HOTKEY
diff --git a/firmware/export/config/gogearhdd1630.h b/firmware/export/config/gogearhdd1630.h
index 8bb14801b0..84e408ce64 100644
--- a/firmware/export/config/gogearhdd1630.h
+++ b/firmware/export/config/gogearhdd1630.h
@@ -205,3 +205,6 @@
205 * writes appear to be ~25% slower. 205 * writes appear to be ~25% slower.
206 */ 206 */
207#define HAVE_ATA_DMA 207#define HAVE_ATA_DMA
208
209/* Define this if a programmable hotkey is mapped */
210//#define HAVE_HOTKEY
diff --git a/firmware/export/config/gogearhdd6330.h b/firmware/export/config/gogearhdd6330.h
index 26da200ce1..b17d1e1ab4 100644
--- a/firmware/export/config/gogearhdd6330.h
+++ b/firmware/export/config/gogearhdd6330.h
@@ -200,3 +200,5 @@
200 200
201#define ICODE_ATTR_TREMOR_NOT_MDCT 201#define ICODE_ATTR_TREMOR_NOT_MDCT
202 202
203/* Define this if a programmable hotkey is mapped */
204//#define HAVE_HOTKEY
diff --git a/firmware/export/config/gogearsa9200.h b/firmware/export/config/gogearsa9200.h
index d9b9462880..09fa4fece5 100644
--- a/firmware/export/config/gogearsa9200.h
+++ b/firmware/export/config/gogearsa9200.h
@@ -194,3 +194,5 @@
194 194
195#define INCLUDE_TIMEOUT_API 195#define INCLUDE_TIMEOUT_API
196 196
197/* Define this if a programmable hotkey is mapped */
198//#define HAVE_HOTKEY
diff --git a/firmware/export/config/iaudio7.h b/firmware/export/config/iaudio7.h
index 44a6f84b0a..6698e13931 100644
--- a/firmware/export/config/iaudio7.h
+++ b/firmware/export/config/iaudio7.h
@@ -160,3 +160,5 @@
160 160
161#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 161#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
162 162
163/* Define this if a programmable hotkey is mapped */
164//#define HAVE_HOTKEY
diff --git a/firmware/export/config/iaudiom3.h b/firmware/export/config/iaudiom3.h
index 99c4605be0..96b4ada136 100644
--- a/firmware/export/config/iaudiom3.h
+++ b/firmware/export/config/iaudiom3.h
@@ -169,3 +169,6 @@
169#define DEFAULT_CONTRAST_SETTING 24 169#define DEFAULT_CONTRAST_SETTING 24
170 170
171#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 171#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
172
173/* Define this if a programmable hotkey is mapped */
174#define HAVE_HOTKEY
diff --git a/firmware/export/config/iaudiom5.h b/firmware/export/config/iaudiom5.h
index 03add43dbf..2bae6fed2d 100644
--- a/firmware/export/config/iaudiom5.h
+++ b/firmware/export/config/iaudiom5.h
@@ -190,3 +190,6 @@
190#define DEFAULT_REMOTE_CONTRAST_SETTING 24 /* Match boot contrast */ 190#define DEFAULT_REMOTE_CONTRAST_SETTING 24 /* Match boot contrast */
191 191
192#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 192#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
193
194/* Define this if a programmable hotkey is mapped */
195//#define HAVE_HOTKEY
diff --git a/firmware/export/config/iaudiox5.h b/firmware/export/config/iaudiox5.h
index 9497cbeab2..e332fe3728 100644
--- a/firmware/export/config/iaudiox5.h
+++ b/firmware/export/config/iaudiox5.h
@@ -205,3 +205,6 @@
205#define MIN_REMOTE_CONTRAST_SETTING 10 205#define MIN_REMOTE_CONTRAST_SETTING 10
206#define MAX_REMOTE_CONTRAST_SETTING 35 206#define MAX_REMOTE_CONTRAST_SETTING 35
207#define DEFAULT_REMOTE_CONTRAST_SETTING 24 /* Match boot contrast */ 207#define DEFAULT_REMOTE_CONTRAST_SETTING 24 /* Match boot contrast */
208
209/* Define this if a programmable hotkey is mapped */
210//#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipod1g2g.h b/firmware/export/config/ipod1g2g.h
index cde745e874..628ce91d5a 100644
--- a/firmware/export/config/ipod1g2g.h
+++ b/firmware/export/config/ipod1g2g.h
@@ -169,3 +169,5 @@
169 169
170#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 170#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
171 171
172/* Define this if a programmable hotkey is mapped */
173#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipod3g.h b/firmware/export/config/ipod3g.h
index 2eafe8141d..c5177d33e7 100644
--- a/firmware/export/config/ipod3g.h
+++ b/firmware/export/config/ipod3g.h
@@ -180,3 +180,5 @@
180 180
181#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 181#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
182 182
183/* Define this if a programmable hotkey is mapped */
184#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipod4g.h b/firmware/export/config/ipod4g.h
index cd71434c10..09151cb468 100644
--- a/firmware/export/config/ipod4g.h
+++ b/firmware/export/config/ipod4g.h
@@ -212,3 +212,6 @@
212 * writes appear to be ~25% slower. 212 * writes appear to be ~25% slower.
213 */ 213 */
214#define HAVE_ATA_DMA 214#define HAVE_ATA_DMA
215
216/* Define this if a programmable hotkey is mapped */
217#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodcolor.h b/firmware/export/config/ipodcolor.h
index aa76f7420a..3eeed571d5 100644
--- a/firmware/export/config/ipodcolor.h
+++ b/firmware/export/config/ipodcolor.h
@@ -194,3 +194,6 @@
194 * writes appear to be ~25% slower. 194 * writes appear to be ~25% slower.
195 */ 195 */
196#define HAVE_ATA_DMA 196#define HAVE_ATA_DMA
197
198/* Define this if a programmable hotkey is mapped */
199#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodmini1g.h b/firmware/export/config/ipodmini1g.h
index fc33ba3ba4..02cd798fcf 100644
--- a/firmware/export/config/ipodmini1g.h
+++ b/firmware/export/config/ipodmini1g.h
@@ -198,3 +198,6 @@
198 * writes appear to be ~25% slower. 198 * writes appear to be ~25% slower.
199 */ 199 */
200#define HAVE_ATA_DMA 200#define HAVE_ATA_DMA
201
202/* Define this if a programmable hotkey is mapped */
203#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodmini2g.h b/firmware/export/config/ipodmini2g.h
index 35e9456d84..fd53a1564a 100644
--- a/firmware/export/config/ipodmini2g.h
+++ b/firmware/export/config/ipodmini2g.h
@@ -208,3 +208,6 @@
208 * writes appear to be ~25% slower. 208 * writes appear to be ~25% slower.
209 */ 209 */
210#define HAVE_ATA_DMA 210#define HAVE_ATA_DMA
211
212/* Define this if a programmable hotkey is mapped */
213#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodnano1g.h b/firmware/export/config/ipodnano1g.h
index 82cdb37b24..18d15e449e 100644
--- a/firmware/export/config/ipodnano1g.h
+++ b/firmware/export/config/ipodnano1g.h
@@ -197,3 +197,6 @@
197 * writes appear to be ~25% slower. 197 * writes appear to be ~25% slower.
198 */ 198 */
199#define HAVE_ATA_DMA 199#define HAVE_ATA_DMA
200
201/* Define this if a programmable hotkey is mapped */
202#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodnano2g.h b/firmware/export/config/ipodnano2g.h
index 989d56338d..3ce4a2926b 100644
--- a/firmware/export/config/ipodnano2g.h
+++ b/firmware/export/config/ipodnano2g.h
@@ -221,3 +221,5 @@
221 221
222#define USB_WRITE_BUFFER_SIZE (1024*64) 222#define USB_WRITE_BUFFER_SIZE (1024*64)
223 223
224/* Define this if a programmable hotkey is mapped */
225#define HAVE_HOTKEY
diff --git a/firmware/export/config/ipodvideo.h b/firmware/export/config/ipodvideo.h
index eec513320a..0b288e4512 100644
--- a/firmware/export/config/ipodvideo.h
+++ b/firmware/export/config/ipodvideo.h
@@ -231,3 +231,6 @@
231 * writes appear to be ~25% slower. 231 * writes appear to be ~25% slower.
232 */ 232 */
233#define HAVE_ATA_DMA 233#define HAVE_ATA_DMA
234
235/* Define this if a programmable hotkey is mapped */
236#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverh10.h b/firmware/export/config/iriverh10.h
index 5365c83239..bda40f6659 100644
--- a/firmware/export/config/iriverh10.h
+++ b/firmware/export/config/iriverh10.h
@@ -191,3 +191,6 @@
191 * writes appear to be ~25% slower. 191 * writes appear to be ~25% slower.
192 */ 192 */
193#define HAVE_ATA_DMA 193#define HAVE_ATA_DMA
194
195/* Define this if a programmable hotkey is mapped */
196#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverh100.h b/firmware/export/config/iriverh100.h
index afebe59785..62835c188e 100644
--- a/firmware/export/config/iriverh100.h
+++ b/firmware/export/config/iriverh100.h
@@ -216,3 +216,6 @@
216#define DEFAULT_REMOTE_CONTRAST_SETTING 42 216#define DEFAULT_REMOTE_CONTRAST_SETTING 42
217 217
218#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 218#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
219
220/* Define this if a programmable hotkey is mapped */
221#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverh10_5gb.h b/firmware/export/config/iriverh10_5gb.h
index 2d8124f972..7ff09273ad 100644
--- a/firmware/export/config/iriverh10_5gb.h
+++ b/firmware/export/config/iriverh10_5gb.h
@@ -179,3 +179,6 @@
179 * writes appear to be ~25% slower. 179 * writes appear to be ~25% slower.
180 */ 180 */
181#define HAVE_ATA_DMA 181#define HAVE_ATA_DMA
182
183/* Define this if a programmable hotkey is mapped */
184#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverh120.h b/firmware/export/config/iriverh120.h
index 55ef43dad2..96309e4c22 100644
--- a/firmware/export/config/iriverh120.h
+++ b/firmware/export/config/iriverh120.h
@@ -217,3 +217,6 @@
217#define DEFAULT_REMOTE_CONTRAST_SETTING 42 217#define DEFAULT_REMOTE_CONTRAST_SETTING 42
218 218
219#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 219#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
220
221/* Define this if a programmable hotkey is mapped */
222#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverh300.h b/firmware/export/config/iriverh300.h
index 9b92c8616b..b951c198b9 100644
--- a/firmware/export/config/iriverh300.h
+++ b/firmware/export/config/iriverh300.h
@@ -204,3 +204,6 @@
204#define MIN_REMOTE_CONTRAST_SETTING 5 204#define MIN_REMOTE_CONTRAST_SETTING 5
205#define MAX_REMOTE_CONTRAST_SETTING 63 205#define MAX_REMOTE_CONTRAST_SETTING 63
206#define DEFAULT_REMOTE_CONTRAST_SETTING 42 206#define DEFAULT_REMOTE_CONTRAST_SETTING 42
207
208/* Define this if a programmable hotkey is mapped */
209#define HAVE_HOTKEY
diff --git a/firmware/export/config/iriverifp7xx.h b/firmware/export/config/iriverifp7xx.h
index a4e4859dc0..ee8fb04841 100644
--- a/firmware/export/config/iriverifp7xx.h
+++ b/firmware/export/config/iriverifp7xx.h
@@ -122,3 +122,5 @@
122 122
123#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 123#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
124 124
125/* Define this if a programmable hotkey is mapped */
126//#define HAVE_HOTKEY
diff --git a/firmware/export/config/logikdax.h b/firmware/export/config/logikdax.h
index 8fbd064306..7d8a51f872 100644
--- a/firmware/export/config/logikdax.h
+++ b/firmware/export/config/logikdax.h
@@ -145,3 +145,5 @@
145 145
146#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 146#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
147 147
148/* Define this if a programmable hotkey is mapped */
149//#define HAVE_HOTKEY
diff --git a/firmware/export/config/lyreproto1.h b/firmware/export/config/lyreproto1.h
index 250b8e2c00..1413adc7e3 100644
--- a/firmware/export/config/lyreproto1.h
+++ b/firmware/export/config/lyreproto1.h
@@ -101,3 +101,5 @@
101#define BOOTFILE "rockbox." BOOTFILE_EXT 101#define BOOTFILE "rockbox." BOOTFILE_EXT
102#define BOOTDIR "/.rockbox" 102#define BOOTDIR "/.rockbox"
103 103
104/* Define this if a programmable hotkey is mapped */
105//#define HAVE_HOTKEY
diff --git a/firmware/export/config/meizum3.h b/firmware/export/config/meizum3.h
index 06720695eb..58f141c4cb 100644
--- a/firmware/export/config/meizum3.h
+++ b/firmware/export/config/meizum3.h
@@ -178,3 +178,5 @@
178#define MAX_BRIGHTNESS_SETTING 15 178#define MAX_BRIGHTNESS_SETTING 15
179#define DEFAULT_BRIGHTNESS_SETTING 10 179#define DEFAULT_BRIGHTNESS_SETTING 10
180 180
181/* Define this if a programmable hotkey is mapped */
182#define HAVE_HOTKEY
diff --git a/firmware/export/config/meizum6sl.h b/firmware/export/config/meizum6sl.h
index ffa8903526..521dc97488 100644
--- a/firmware/export/config/meizum6sl.h
+++ b/firmware/export/config/meizum6sl.h
@@ -176,3 +176,5 @@
176#define MAX_BRIGHTNESS_SETTING 13 /* 3/16 (18.75%) */ 176#define MAX_BRIGHTNESS_SETTING 13 /* 3/16 (18.75%) */
177#define DEFAULT_BRIGHTNESS_SETTING 8 /* 8/16 (50.00%) = x5 boot default */ 177#define DEFAULT_BRIGHTNESS_SETTING 8 /* 8/16 (50.00%) = x5 boot default */
178 178
179/* Define this if a programmable hotkey is mapped */
180//#define HAVE_HOTKEY
diff --git a/firmware/export/config/meizum6sp.h b/firmware/export/config/meizum6sp.h
index 1cba45d70a..11716f6ecd 100644
--- a/firmware/export/config/meizum6sp.h
+++ b/firmware/export/config/meizum6sp.h
@@ -185,3 +185,5 @@
185#define MAX_BRIGHTNESS_SETTING 13 /* 3/16 (18.75%) */ 185#define MAX_BRIGHTNESS_SETTING 13 /* 3/16 (18.75%) */
186#define DEFAULT_BRIGHTNESS_SETTING 8 /* 8/16 (50.00%) = x5 boot default */ 186#define DEFAULT_BRIGHTNESS_SETTING 8 /* 8/16 (50.00%) = x5 boot default */
187 187
188/* Define this if a programmable hotkey is mapped */
189//#define HAVE_HOTKEY
diff --git a/firmware/export/config/mini2440.h b/firmware/export/config/mini2440.h
index 5dad250930..7ece948d80 100644
--- a/firmware/export/config/mini2440.h
+++ b/firmware/export/config/mini2440.h
@@ -154,3 +154,5 @@
154#define BOOTFILE "rockbox." BOOTFILE_EXT 154#define BOOTFILE "rockbox." BOOTFILE_EXT
155#define BOOTDIR "/.rockbox" 155#define BOOTDIR "/.rockbox"
156 156
157/* Define this if a programmable hotkey is mapped */
158//#define HAVE_HOTKEY
diff --git a/firmware/export/config/mrobe100.h b/firmware/export/config/mrobe100.h
index 2bbb03919d..1fdd4ba6d4 100644
--- a/firmware/export/config/mrobe100.h
+++ b/firmware/export/config/mrobe100.h
@@ -205,3 +205,6 @@
205 * writes appear to be ~25% slower. 205 * writes appear to be ~25% slower.
206 */ 206 */
207#define HAVE_ATA_DMA 207#define HAVE_ATA_DMA
208
209/* Define this if a programmable hotkey is mapped */
210//#define HAVE_HOTKEY
diff --git a/firmware/export/config/mrobe500.h b/firmware/export/config/mrobe500.h
index 96e25c9247..0f443ebc4f 100644
--- a/firmware/export/config/mrobe500.h
+++ b/firmware/export/config/mrobe500.h
@@ -256,3 +256,5 @@
256 256
257#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 257#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
258 258
259/* Define this if a programmable hotkey is mapped */
260//#define HAVE_HOTKEY
diff --git a/firmware/export/config/ondavx747.h b/firmware/export/config/ondavx747.h
index 36e787a32b..ae80cac562 100644
--- a/firmware/export/config/ondavx747.h
+++ b/firmware/export/config/ondavx747.h
@@ -218,3 +218,5 @@ No access to the NAND yet..
218#define USB_VENDOR_ID 0x07C4 218#define USB_VENDOR_ID 0x07C4
219#define USB_PRODUCT_ID 0xA4A5 219#define USB_PRODUCT_ID 0xA4A5
220 220
221/* Define this if a programmable hotkey is mapped */
222//#define HAVE_HOTKEY
diff --git a/firmware/export/config/ondavx767.h b/firmware/export/config/ondavx767.h
index 9c5248a6a1..19bb7ed580 100644
--- a/firmware/export/config/ondavx767.h
+++ b/firmware/export/config/ondavx767.h
@@ -165,3 +165,5 @@
165#define USB_VENDOR_ID 0x07C4 165#define USB_VENDOR_ID 0x07C4
166#define USB_PRODUCT_ID 0xA4A5 166#define USB_PRODUCT_ID 0xA4A5
167 167
168/* Define this if a programmable hotkey is mapped */
169//#define HAVE_HOTKEY
diff --git a/firmware/export/config/ondavx777.h b/firmware/export/config/ondavx777.h
index 200d14879c..a2ad15533a 100644
--- a/firmware/export/config/ondavx777.h
+++ b/firmware/export/config/ondavx777.h
@@ -205,3 +205,5 @@ No access to the NAND yet..
205#define USB_VENDOR_ID 0x07C4 205#define USB_VENDOR_ID 0x07C4
206#define USB_PRODUCT_ID 0xA4A5 206#define USB_PRODUCT_ID 0xA4A5
207 207
208/* Define this if a programmable hotkey is mapped */
209//#define HAVE_HOTKEY
diff --git a/firmware/export/config/samsungyh820.h b/firmware/export/config/samsungyh820.h
index 0ca244ae39..001acd8992 100644
--- a/firmware/export/config/samsungyh820.h
+++ b/firmware/export/config/samsungyh820.h
@@ -186,3 +186,6 @@
186 * writes appear to be ~25% slower. 186 * writes appear to be ~25% slower.
187 */ 187 */
188#define HAVE_ATA_DMA 188#define HAVE_ATA_DMA
189
190/* Define this if a programmable hotkey is mapped */
191//#define HAVE_HOTKEY
diff --git a/firmware/export/config/samsungyh920.h b/firmware/export/config/samsungyh920.h
index a6a57f7227..051fa2c1f9 100644
--- a/firmware/export/config/samsungyh920.h
+++ b/firmware/export/config/samsungyh920.h
@@ -192,3 +192,6 @@
192 * writes appear to be ~25% slower. 192 * writes appear to be ~25% slower.
193 */ 193 */
194#define HAVE_ATA_DMA 194#define HAVE_ATA_DMA
195
196/* Define this if a programmable hotkey is mapped */
197//#define HAVE_HOTKEY
diff --git a/firmware/export/config/samsungyh925.h b/firmware/export/config/samsungyh925.h
index c19901c019..7f24f93581 100644
--- a/firmware/export/config/samsungyh925.h
+++ b/firmware/export/config/samsungyh925.h
@@ -190,3 +190,6 @@
190 * writes appear to be ~25% slower. 190 * writes appear to be ~25% slower.
191 */ 191 */
192#define HAVE_ATA_DMA 192#define HAVE_ATA_DMA
193
194/* Define this if a programmable hotkey is mapped */
195//#define HAVE_HOTKEY
diff --git a/firmware/export/config/samsungyps3.h b/firmware/export/config/samsungyps3.h
index fd8fde6f6c..0eba4a27d5 100644
--- a/firmware/export/config/samsungyps3.h
+++ b/firmware/export/config/samsungyps3.h
@@ -180,3 +180,5 @@
180#define MAX_BRIGHTNESS_SETTING 15 180#define MAX_BRIGHTNESS_SETTING 15
181#define DEFAULT_BRIGHTNESS_SETTING 10 181#define DEFAULT_BRIGHTNESS_SETTING 10
182 182
183/* Define this if a programmable hotkey is mapped */
184#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansac100.h b/firmware/export/config/sansac100.h
index a332bf5670..fc298b01d8 100644
--- a/firmware/export/config/sansac100.h
+++ b/firmware/export/config/sansac100.h
@@ -126,3 +126,5 @@
126 126
127#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 127#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
128 128
129/* Define this if a programmable hotkey is mapped */
130#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansac200.h b/firmware/export/config/sansac200.h
index 0e0ac01f2f..f01c664533 100644
--- a/firmware/export/config/sansac200.h
+++ b/firmware/export/config/sansac200.h
@@ -205,3 +205,6 @@
205#define DEFAULT_REC_MIC_GAIN 23 205#define DEFAULT_REC_MIC_GAIN 23
206#define DEFAULT_REC_LEFT_GAIN 23 206#define DEFAULT_REC_LEFT_GAIN 23
207#define DEFAULT_REC_RIGHT_GAIN 23 207#define DEFAULT_REC_RIGHT_GAIN 23
208
209/* Define this if a programmable hotkey is mapped */
210#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansac200v2.h b/firmware/export/config/sansac200v2.h
index aef789380d..b9a86cd023 100644
--- a/firmware/export/config/sansac200v2.h
+++ b/firmware/export/config/sansac200v2.h
@@ -201,3 +201,6 @@
201#define DEFAULT_REC_MIC_GAIN 23 201#define DEFAULT_REC_MIC_GAIN 23
202#define DEFAULT_REC_LEFT_GAIN 23 202#define DEFAULT_REC_LEFT_GAIN 23
203#define DEFAULT_REC_RIGHT_GAIN 23 203#define DEFAULT_REC_RIGHT_GAIN 23
204
205/* Define this if a programmable hotkey is mapped */
206#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansaclip.h b/firmware/export/config/sansaclip.h
index 7d82f80284..12c67bf35f 100644
--- a/firmware/export/config/sansaclip.h
+++ b/firmware/export/config/sansaclip.h
@@ -199,3 +199,6 @@
199#define DEFAULT_REC_MIC_GAIN 23 199#define DEFAULT_REC_MIC_GAIN 23
200#define DEFAULT_REC_LEFT_GAIN 23 200#define DEFAULT_REC_LEFT_GAIN 23
201#define DEFAULT_REC_RIGHT_GAIN 23 201#define DEFAULT_REC_RIGHT_GAIN 23
202
203/* Define this if a programmable hotkey is mapped */
204//#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansaclipplus.h b/firmware/export/config/sansaclipplus.h
index 76be3cae7f..c5e6aa5c34 100644
--- a/firmware/export/config/sansaclipplus.h
+++ b/firmware/export/config/sansaclipplus.h
@@ -211,3 +211,6 @@
211#define DEFAULT_REC_MIC_GAIN 23 211#define DEFAULT_REC_MIC_GAIN 23
212#define DEFAULT_REC_LEFT_GAIN 23 212#define DEFAULT_REC_LEFT_GAIN 23
213#define DEFAULT_REC_RIGHT_GAIN 23 213#define DEFAULT_REC_RIGHT_GAIN 23
214
215/* Define this if a programmable hotkey is mapped */
216//#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansaclipv2.h b/firmware/export/config/sansaclipv2.h
index 1736d6fe12..30f53dd58e 100644
--- a/firmware/export/config/sansaclipv2.h
+++ b/firmware/export/config/sansaclipv2.h
@@ -207,3 +207,6 @@
207#define DEFAULT_REC_MIC_GAIN 23 207#define DEFAULT_REC_MIC_GAIN 23
208#define DEFAULT_REC_LEFT_GAIN 23 208#define DEFAULT_REC_LEFT_GAIN 23
209#define DEFAULT_REC_RIGHT_GAIN 23 209#define DEFAULT_REC_RIGHT_GAIN 23
210
211/* Define this if a programmable hotkey is mapped */
212//#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansae200.h b/firmware/export/config/sansae200.h
index 687878ce06..8f4f3235dc 100644
--- a/firmware/export/config/sansae200.h
+++ b/firmware/export/config/sansae200.h
@@ -214,3 +214,5 @@
214#define IRAMORIG 0x40004000 214#define IRAMORIG 0x40004000
215#endif 215#endif
216 216
217/* Define this if a programmable hotkey is mapped */
218#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansae200v2.h b/firmware/export/config/sansae200v2.h
index b06aba1f8d..c51eee38a7 100644
--- a/firmware/export/config/sansae200v2.h
+++ b/firmware/export/config/sansae200v2.h
@@ -211,3 +211,6 @@
211#define DEFAULT_REC_MIC_GAIN 23 211#define DEFAULT_REC_MIC_GAIN 23
212#define DEFAULT_REC_LEFT_GAIN 23 212#define DEFAULT_REC_LEFT_GAIN 23
213#define DEFAULT_REC_RIGHT_GAIN 23 213#define DEFAULT_REC_RIGHT_GAIN 23
214
215/* Define this if a programmable hotkey is mapped */
216#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansafuze.h b/firmware/export/config/sansafuze.h
index 7e722d6e47..0005939d1b 100644
--- a/firmware/export/config/sansafuze.h
+++ b/firmware/export/config/sansafuze.h
@@ -209,3 +209,5 @@
209 209
210#define INCLUDE_TIMEOUT_API 210#define INCLUDE_TIMEOUT_API
211 211
212/* Define this if a programmable hotkey is mapped */
213#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansafuzev2.h b/firmware/export/config/sansafuzev2.h
index fcb4a676d3..b71f852007 100644
--- a/firmware/export/config/sansafuzev2.h
+++ b/firmware/export/config/sansafuzev2.h
@@ -206,3 +206,5 @@
206 206
207#define INCLUDE_TIMEOUT_API 207#define INCLUDE_TIMEOUT_API
208 208
209/* Define this if a programmable hotkey is mapped */
210#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansam200.h b/firmware/export/config/sansam200.h
index 0f071e18ab..e3109f86b8 100644
--- a/firmware/export/config/sansam200.h
+++ b/firmware/export/config/sansam200.h
@@ -134,3 +134,5 @@
134 134
135#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 135#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
136 136
137/* Define this if a programmable hotkey is mapped */
138//#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansam200v4.h b/firmware/export/config/sansam200v4.h
index 0d593b4d97..1914b4abf9 100644
--- a/firmware/export/config/sansam200v4.h
+++ b/firmware/export/config/sansam200v4.h
@@ -163,3 +163,5 @@
163 163
164#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ 164#define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */
165 165
166/* Define this if a programmable hotkey is mapped */
167//#define HAVE_HOTKEY
diff --git a/firmware/export/config/sansaview.h b/firmware/export/config/sansaview.h
index 4111b8380a..0752b6c61d 100644
--- a/firmware/export/config/sansaview.h
+++ b/firmware/export/config/sansaview.h
@@ -201,3 +201,6 @@
201#define DEFAULT_REC_MIC_GAIN 23 201#define DEFAULT_REC_MIC_GAIN 23
202#define DEFAULT_REC_LEFT_GAIN 23 202#define DEFAULT_REC_LEFT_GAIN 23
203#define DEFAULT_REC_RIGHT_GAIN 23 203#define DEFAULT_REC_RIGHT_GAIN 23
204
205/* Define this if a programmable hotkey is mapped */
206#define HAVE_HOTKEY
diff --git a/firmware/export/config/tatungtpj1022.h b/firmware/export/config/tatungtpj1022.h
index aca131df8b..a0a757b24b 100644
--- a/firmware/export/config/tatungtpj1022.h
+++ b/firmware/export/config/tatungtpj1022.h
@@ -142,3 +142,6 @@
142 * writes appear to be ~25% slower. 142 * writes appear to be ~25% slower.
143 */ 143 */
144#define HAVE_ATA_DMA 144#define HAVE_ATA_DMA
145
146/* Define this if a programmable hotkey is mapped */
147//#define HAVE_HOTKEY
diff --git a/firmware/export/config/vibe500.h b/firmware/export/config/vibe500.h
index 37e78f7b61..805f250ab1 100644
--- a/firmware/export/config/vibe500.h
+++ b/firmware/export/config/vibe500.h
@@ -199,3 +199,6 @@
199 * writes appear to be ~25% slower. 199 * writes appear to be ~25% slower.
200 */ 200 */
201#define HAVE_ATA_DMA 201#define HAVE_ATA_DMA
202
203/* Define this if a programmable hotkey is mapped */
204//#define HAVE_HOTKEY
diff --git a/firmware/export/config/zenvisionm30gb.h b/firmware/export/config/zenvisionm30gb.h
index d8005bb83d..16309e8673 100644
--- a/firmware/export/config/zenvisionm30gb.h
+++ b/firmware/export/config/zenvisionm30gb.h
@@ -174,3 +174,5 @@
174#define BUTTON_DEBUG 174#define BUTTON_DEBUG
175*/ 175*/
176 176
177/* Define this if a programmable hotkey is mapped */
178//#define HAVE_HOTKEY
diff --git a/firmware/export/config/zenvisionm60gb.h b/firmware/export/config/zenvisionm60gb.h
index bdede47962..6846f13258 100644
--- a/firmware/export/config/zenvisionm60gb.h
+++ b/firmware/export/config/zenvisionm60gb.h
@@ -166,3 +166,5 @@
166#define USB_PRODUCT_ID 0x4133 166#define USB_PRODUCT_ID 0x4133
167#define USB_NUM_ENDPOINTS 7 167#define USB_NUM_ENDPOINTS 7
168 168
169/* Define this if a programmable hotkey is mapped */
170//#define HAVE_HOTKEY