summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-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
39 files changed, 493 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 {