summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2006-08-15 12:27:07 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2006-08-15 12:27:07 +0000
commit224c0a13ebb5828b9bc06a9c1c23ae17f0ac19f9 (patch)
treebae2154b272f786983cf8e6de28d33f98f327560
parentc0f8b187706364f5e4bda2ac26750d14454c901d (diff)
downloadrockbox-224c0a13ebb5828b9bc06a9c1c23ae17f0ac19f9.tar.gz
rockbox-224c0a13ebb5828b9bc06a9c1c23ae17f0ac19f9.zip
Finally, the new button action system is here, thanks to Jonathan Gordon. Some button mappings have changed and other things may break. Comments should go to the forum, http://forums.rockbox.org/index.php?topic=5829.0 or the mailing list.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10582 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/SOURCES16
-rw-r--r--apps/action.c215
-rw-r--r--apps/action.h146
-rw-r--r--apps/alarm_menu.c38
-rw-r--r--apps/bookmark.c76
-rw-r--r--apps/bookmark.h48
-rw-r--r--apps/debug_menu.c244
-rw-r--r--apps/eq_menu.c118
-rw-r--r--apps/gui/color_picker.c98
-rw-r--r--apps/gui/gwps-common.c37
-rw-r--r--apps/gui/gwps-common.h3
-rw-r--r--apps/gui/gwps.c316
-rw-r--r--apps/gui/list.c90
-rw-r--r--apps/gui/list.h87
-rw-r--r--apps/gui/quickscreen.c70
-rw-r--r--apps/gui/quickscreen.h36
-rw-r--r--apps/gui/select.c45
-rw-r--r--apps/gui/select.h98
-rw-r--r--apps/gui/yesno.c15
-rw-r--r--apps/gui/yesno.h35
-rw-r--r--apps/keymaps/keymap-h1x0_h3x0.c386
-rw-r--r--apps/keymaps/keymap-ipod.c151
-rw-r--r--apps/keymaps/keymap-newtarget.c77
-rw-r--r--apps/keymaps/keymap-ondio.c135
-rw-r--r--apps/keymaps/keymap-player.c136
-rw-r--r--apps/keymaps/keymap-recorder.c141
-rw-r--r--apps/keymaps/keymap-x5.c141
-rw-r--r--apps/logfdisp.c14
-rw-r--r--apps/main.c2
-rw-r--r--apps/main_menu.c40
-rw-r--r--apps/menu.c42
-rw-r--r--apps/onplay.c6
-rw-r--r--apps/playback.h6
-rw-r--r--apps/playlist.c13
-rw-r--r--apps/playlist_catalog.c44
-rw-r--r--apps/playlist_viewer.c85
-rw-r--r--apps/plugin.c5
-rw-r--r--apps/plugin.h9
-rw-r--r--apps/recorder/radio.c21
-rw-r--r--apps/screens.c86
-rw-r--r--apps/screens.h45
-rw-r--r--apps/settings.c19
-rw-r--r--apps/settings.h111
-rw-r--r--apps/tagtree.c3
-rw-r--r--apps/tree.c108
-rw-r--r--apps/tree.h160
-rw-r--r--firmware/drivers/lcd-h100-remote.c7
47 files changed, 1982 insertions, 1842 deletions
diff --git a/apps/SOURCES b/apps/SOURCES
index 3548980f28..a5dfc8bc5f 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -1,6 +1,7 @@
1#ifdef ROCKBOX_HAS_LOGF 1#ifdef ROCKBOX_HAS_LOGF
2logfdisp.c 2logfdisp.c
3#endif 3#endif
4action.c
4alarm_menu.c 5alarm_menu.c
5abrepeat.c 6abrepeat.c
6bookmark.c 7bookmark.c
@@ -81,3 +82,18 @@ eq_menu.c
81#endif 82#endif
82metadata.c 83metadata.c
83tagcache.c 84tagcache.c
85#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
86 || (CONFIG_KEYPAD == IRIVER_H300_PAD)
87keymaps/keymap-h1x0_h3x0.c
88#elif ((CONFIG_KEYPAD == IPOD_4G_PAD) \
89 || (CONFIG_KEYPAD == IPOD_3G_PAD))
90keymaps/keymap-ipod.c
91#elif CONFIG_KEYPAD == RECORDER_PAD
92keymaps/keymap-recorder.c
93#elif CONFIG_KEYPAD == ONDIO_PAD
94keymaps/keymap-ondio.c
95#elif CONFIG_KEYPAD == PLAYER_PAD
96keymaps/keymap-player.c
97#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
98keymaps/keymap-x5.c
99#endif
diff --git a/apps/action.c b/apps/action.c
new file mode 100644
index 0000000000..fc5a8b88a9
--- /dev/null
+++ b/apps/action.c
@@ -0,0 +1,215 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18#include <stdio.h>
19#include <string.h>
20#include <stdlib.h>
21
22#include "config.h"
23#include "button.h"
24#include "action.h"
25#include "kernel.h"
26#include "debug.h"
27
28bool ignore_until_release = false;
29int last_button = BUTTON_NONE;
30int soft_unlock_action = ACTION_NONE;
31bool allow_remote_actions = true;
32/*
33 * do_button_check is the worker function for get_default_action.
34 * returns ACTION_UNKNOWN or the requested return value from the list.
35 */
36inline int do_button_check(struct button_mapping *items,
37 int button, int last_button, int *start)
38{
39 int i = 0;
40 int ret = ACTION_UNKNOWN;
41 if (items == NULL)
42 return ACTION_UNKNOWN;
43
44 /* Special case to make the keymaps smaller */
45 if(button & BUTTON_REPEAT)
46 last_button &= ~BUTTON_REPEAT;
47
48 while (items[i].button_code != BUTTON_NONE)
49 {
50 if (items[i].button_code == button)
51 {
52 if (items[i].pre_button_code != BUTTON_NONE)
53 {
54 if ((items[i].pre_button_code == last_button) ||
55 (items[i].button_code == last_button))
56 {
57 ret = items[i].action_code;
58 break;
59 }
60 }
61 else
62 {
63 ret = items[i].action_code;
64 break;
65 }
66 }
67 i++;
68 }
69 *start = i;
70 return ret;
71}
72
73inline int get_next_context(struct button_mapping *items, int i)
74{
75 while (items[i].button_code != BUTTON_NONE)
76 i++;
77 return (items[i].action_code == ACTION_NONE ) ?
78 CONTEXT_STD :
79 items[i].action_code;
80}
81/*
82 * int get_action_worker(int context, struct button_mapping *user_mappings,
83 int timeout)
84 This function searches the button list for the given context for the just
85 pressed button.
86 If there is a match it returns the value from the list.
87 If there is no match..
88 the last item in the list "points" to the next context in a chain
89 so the "chain" is followed until the button is found.
90 putting ACTION_NONE will get CONTEXT_STD which is always the last list checked.
91
92 Timeout can be TIMEOUT_NOBLOCK to return immediatly
93 TIMEOUT_BLOCK to wait for a button press
94 Any number >0 to wait that many ticks for a press
95
96 */
97int get_action_worker(int context, int timeout,
98 struct button_mapping* (*get_context_map)(int) )
99{
100 struct button_mapping *items = NULL;
101 int button;
102 int i=0;
103 int ret = ACTION_UNKNOWN;
104 if (timeout == TIMEOUT_NOBLOCK)
105 button = button_get(false);
106 else if (timeout == TIMEOUT_BLOCK)
107 button = button_get(true);
108 else
109 button = button_get_w_tmo(timeout);
110
111
112 if (button == BUTTON_NONE || button&SYS_EVENT)
113 {
114 return button;
115 }
116
117 if (ignore_until_release == true)
118 {
119 if (button&BUTTON_REL)
120 {
121 ignore_until_release = false;
122 }
123 /*last_button = BUTTON_NONE; this is done by action_signalscreenchange() */
124 return ACTION_UNKNOWN; /* "safest" return value */
125 }
126
127 if (soft_unlock_action != ACTION_NONE)
128 {
129 if ((button&BUTTON_REMOTE) && !allow_remote_actions)
130 return ACTION_NONE;
131 }
132 /* logf("%x,%x",last_button,button); */
133 do
134 {
135 /* logf("context = %x",context); */
136#if (BUTTON_REMOTE != 0)
137 if (button&BUTTON_REMOTE)
138 context |= CONTEXT_REMOTE;
139#endif
140 if ((context&CONTEXT_CUSTOM) && get_context_map)
141 items = get_context_map(context);
142 else
143 items = get_context_mapping(context);
144
145 ret = do_button_check(items,button,last_button,&i);
146
147 if ((context == CONTEXT_STD)
148#if (BUTTON_REMOTE != 0)
149 || ((unsigned)context == (CONTEXT_STD|CONTEXT_REMOTE))
150#endif
151 ) break;
152
153 if (ret == ACTION_UNKNOWN )
154 {
155 context = get_next_context(items,i);
156 i = 0;
157 }
158 else break;
159 } while (1);
160 /* DEBUGF("ret = %x\n",ret); */
161
162 if (soft_unlock_action != ACTION_NONE)
163 {
164 if ((button&BUTTON_REMOTE) == 0)
165 {
166 if (soft_unlock_action == ret)
167 {
168 soft_unlock_action = ACTION_NONE;
169 ret = ACTION_NONE; /* no need to return the code */
170 }
171 }
172 else if (!allow_remote_actions)
173 ret = ACTION_NONE;
174 }
175
176 last_button = button;
177 return ret;
178}
179
180int get_action(int context, int timeout)
181{
182 return get_action_worker(context,timeout,NULL);
183}
184
185int get_custom_action(int context,int timeout,
186 struct button_mapping* (*get_context_map)(int))
187{
188 return get_action_worker(context,timeout,get_context_map);
189}
190
191bool action_userabort(int timeout)
192{
193 action_signalscreenchange();
194 int action = get_action_worker(CONTEXT_STD,timeout,NULL);
195 bool ret = (action == ACTION_STD_CANCEL);
196 action_signalscreenchange();
197 return ret;
198}
199
200void action_signalscreenchange(void)
201{
202 if ((last_button != BUTTON_NONE) &&
203 !(last_button&BUTTON_REL))
204 {
205 ignore_until_release = true;
206 }
207 last_button = BUTTON_NONE;
208}
209
210void action_setsoftwarekeylock(int unlock_action, bool allow_remote)
211{
212 soft_unlock_action = unlock_action;
213 allow_remote_actions = allow_remote;
214 last_button = BUTTON_NONE;
215}
diff --git a/apps/action.h b/apps/action.h
index 3c3db7d54e..24f3d990f0 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -19,11 +19,147 @@
19#define __ACTION_H__ 19#define __ACTION_H__
20 20
21#include "stdbool.h" 21#include "stdbool.h"
22#include "button.h"
22 23
23#define CONTEXT_WPS 1 24#define LAST_ITEM_IN_LIST { ACTION_NONE, BUTTON_NONE, BUTTON_NONE }
24#define CONTEXT_TREE 2 25#define LAST_ITEM_IN_LIST__NEXTLIST(a) { a, BUTTON_NONE, BUTTON_NONE }
25#define CONTEXT_RECORD 3 26
26#define CONTEXT_MAINMENU 4 27#define TIMEOUT_BLOCK -1
27#define CONTEXT_ID3DB 5 28#define TIMEOUT_NOBLOCK 0
29#define CONTEXT_REMOTE 0x80000000 /* | this against another context to get remote buttons for that context */
30#define CONTEXT_CUSTOM 0x40000000 /* | this against anything to get your context number */
31
32enum {
33 CONTEXT_STD = 0,
34 /* These CONTEXT_ values were here before me,
35 there values may have significance, so dont touch! */
36 CONTEXT_WPS = 1,
37 CONTEXT_TREE = 2,
38 CONTEXT_RECORD = 3,
39 CONTEXT_MAINMENU = 4,
40 CONTEXT_ID3DB = 5,
41 /* Add new contexts here, no need to explicitly define a value for them */
42 CONTEXT_LIST,
43 CONTEXT_SETTINGS, /* options style settings, like from menus */
44 CONTEXT_SETTINGSGRAPHICAL, /* screens like eq config and colour chooser */
45
46 CONTEXT_YESNOSCREEN, /*NOTE: make sure your target has this and ACTION_YESNO_ACCEPT */
47 CONTEXT_BOOKMARKSCREEN, /*NOTE: requires the action_setting_* mappings also */
48 CONTEXT_QUICKSCREEN, /* uses ACTION_QS_ defines below */
49};
50
51
52enum {
53
54 ACTION_NONE = BUTTON_NONE,
55 ACTION_UNKNOWN,
56
57 /* standard actions, use these first */
58 ACTION_STD_PREV,
59 ACTION_STD_PREVREPEAT,
60 ACTION_STD_NEXT,
61 ACTION_STD_NEXTREPEAT,
62
63 ACTION_STD_OK,
64 ACTION_STD_CANCEL,
65 ACTION_STD_CONTEXT,
66 ACTION_STD_MENU,
67 ACTION_STD_QUICKSCREEN,
68 ACTION_STD_KEYLOCK, /* software keylock in wps screen, very optional
69 use with action_setsoftwarekeylock */
70
71
72 /* code context actions */
73
74 /* WPS codes */
75 ACTION_WPS_BROWSE,
76 ACTION_WPS_PLAY,
77 ACTION_WPS_SEEKBACK,
78 ACTION_WPS_SEEKFWD,
79 ACTION_WPS_STOPSEEK,
80 ACTION_WPS_SKIPNEXT,
81 ACTION_WPS_SKIPPREV,
82 ACTION_WPS_STOP,
83 ACTION_WPS_VOLDOWN,
84 ACTION_WPS_VOLUP,
85 ACTION_WPS_NEXTDIR,/* optional */
86 ACTION_WPS_PREVDIR,/* optional */
87 ACTION_WPS_PITCHSCREEN,/* optional */
88 ACTION_WPS_ID3SCREEN,/* optional */
89 ACTION_WPS_CONTEXT,
90 ACTION_WPS_QUICKSCREEN,/* optional */
91 ACTION_WPS_MENU, /*this should be the same as ACTION_STD_MENU */
92 /* following code are for AB mode in wps,
93 only needed if defined(AB_REPEAT_ENABLE) */
94 ACTION_WPSAB_SINGLE, /* No targets use this, but leave n just-in-case! */
95 ACTION_WPSAB_SETA, /* either #define WPS_AB_SHARE_DIR_BUTTONS */
96 ACTION_WPSAB_SETB, /* OR implement ACTION_WPSAB_SET[AB] */
97 ACTION_WPSAB_RESET,
98
99 /* list and tree page up/down */
100 ACTION_LISTTREE_PGUP,/* optional */
101 ACTION_LISTTREE_PGDOWN,/* optional */
102 ACTION_LISTTREE_RC_PGUP,/* optional */
103 ACTION_LISTTREE_RC_PGDOWN,/* optional */
104
105 /* tree */
106 ACTION_TREE_PGLEFT,/* optional */
107 ACTION_TREE_PGRIGHT,/* optional */
108 ACTION_TREE_STOP,
109 ACTION_TREE_WPS,
110
111 /* recording screen */
112
113 /* main menu */
114
115 /* id3db */
116
117 /* list */
118
119 /* settings */
120 ACTION_SETTINGS_INC,
121 ACTION_SETTINGS_INCREPEAT,
122 ACTION_SETTINGS_DEC,
123 ACTION_SETTINGS_DECREPEAT,
124
125 /* yesno screen */
126 ACTION_YESNO_ACCEPT,
127
128 /* bookmark screen */
129 ACTION_BMARK_DELETE,
130
131 /* quickscreen */
132 ACTION_QS_LEFT,
133 ACTION_QS_RIGHT,
134 ACTION_QS_DOWN,
135 ACTION_QS_DOWNINV, /* why is this not called up?? :p */
136
137};
138
139struct button_mapping {
140 int action_code;
141 int button_code;
142 int pre_button_code;
143};
144/* use if you want to supply your own button mappings, PLUGINS ONLY */
145/* get_context_map is a function which returns a button_mapping* depedning on the given context */
146/* custom button_mappings may "chain" to inbuilt CONTEXT's */
147int get_custom_action(int context,int timeout,
148 struct button_mapping* (*get_context_map)(int));
149/* use if one of the standard CONTEXT_ mappings will work (ALL the core should be using this! */
150int get_action(int context, int timeout);
151/* call this whenever you leave your button loop */
152void action_signalscreenchange(void);
153
154/* call this if you need to check for ACTION_STD_CANCEL only (i.e user abort! */
155bool action_userabort(int timeout);
156
157/* on targets without hardware keylock, use this to to emulate keylock.
158 unlock_action is the action which will disaable the keylock
159 allow_remote should be true if you want the remote buttons to still be usable while locked */
160void action_setsoftwarekeylock(int unlock_action, bool allow_remote);
161
162/* no other code should need this apart from action.c */
163struct button_mapping* get_context_mapping(int context);
28 164
29#endif 165#endif
diff --git a/apps/alarm_menu.c b/apps/alarm_menu.c
index ae5d5bb752..03234352d7 100644
--- a/apps/alarm_menu.c
+++ b/apps/alarm_menu.c
@@ -25,7 +25,7 @@
25#include "options.h" 25#include "options.h"
26 26
27#include "lcd.h" 27#include "lcd.h"
28#include "button.h" 28#include "action.h"
29#include "kernel.h" 29#include "kernel.h"
30#include "sprintf.h" 30#include "sprintf.h"
31#include <string.h> 31#include <string.h>
@@ -56,6 +56,7 @@ bool alarm_screen(void)
56 int button; 56 int button;
57 int i; 57 int i;
58 bool update = true; 58 bool update = true;
59
59 60
60 rtc_get_alarm(&h, &m); 61 rtc_get_alarm(&h, &m);
61 62
@@ -84,10 +85,10 @@ bool alarm_screen(void)
84 screens[i].puts(0, 1, buf); 85 screens[i].puts(0, 1, buf);
85 gui_textarea_update(&screens[i]); 86 gui_textarea_update(&screens[i]);
86 } 87 }
87 button = button_get_w_tmo(HZ); 88 button = get_action(CONTEXT_SETTINGS,HZ);
88 89
89 switch(button) { 90 switch(button) {
90 case BUTTON_PLAY: 91 case ACTION_STD_OK:
91 /* prevent that an alarm occurs in the shutdown procedure */ 92 /* prevent that an alarm occurs in the shutdown procedure */
92 /* accept alarms only if they are in 2 minutes or more */ 93 /* accept alarms only if they are in 2 minutes or more */
93 tm = get_time(); 94 tm = get_time();
@@ -106,8 +107,8 @@ bool alarm_screen(void)
106 break; 107 break;
107 108
108 /* inc(m) */ 109 /* inc(m) */
109 case BUTTON_RIGHT: 110 case ACTION_SETTINGS_INC:
110 case BUTTON_RIGHT | BUTTON_REPEAT: 111 case ACTION_SETTINGS_INCREPEAT:
111 m += 5; 112 m += 5;
112 if (m == 60) { 113 if (m == 60) {
113 h += 1; 114 h += 1;
@@ -118,8 +119,8 @@ bool alarm_screen(void)
118 break; 119 break;
119 120
120 /* dec(m) */ 121 /* dec(m) */
121 case BUTTON_LEFT: 122 case ACTION_SETTINGS_DEC:
122 case BUTTON_LEFT | BUTTON_REPEAT: 123 case ACTION_SETTINGS_DECREPEAT:
123 m -= 5; 124 m -= 5;
124 if (m == -5) { 125 if (m == -5) {
125 h -= 1; 126 h -= 1;
@@ -129,32 +130,25 @@ bool alarm_screen(void)
129 h = 23; 130 h = 23;
130 break; 131 break;
131 132
132#if CONFIG_KEYPAD == RECORDER_PAD
133 /* inc(h) */ 133 /* inc(h) */
134 case BUTTON_UP: 134 case ACTION_STD_NEXT:
135 case BUTTON_UP | BUTTON_REPEAT: 135 case ACTION_STD_NEXTREPEAT:
136 h = (h+1) % 24; 136 h = (h+1) % 24;
137 break; 137 break;
138 138
139 /* dec(h) */ 139 /* dec(h) */
140 case BUTTON_DOWN: 140 case ACTION_STD_PREV:
141 case BUTTON_DOWN | BUTTON_REPEAT: 141 case ACTION_STD_NEXTREPEAT:
142 h = (h+23) % 24; 142 h = (h+23) % 24;
143 break; 143 break;
144#endif 144
145 145 case ACTION_STD_CANCEL:
146#if CONFIG_KEYPAD == RECORDER_PAD
147 case BUTTON_OFF:
148#else
149 case BUTTON_STOP:
150 case BUTTON_MENU:
151#endif
152 rtc_enable_alarm(false); 146 rtc_enable_alarm(false);
153 gui_syncsplash(HZ*2, true, str(LANG_ALARM_MOD_DISABLE)); 147 gui_syncsplash(HZ*2, true, str(LANG_ALARM_MOD_DISABLE));
154 done = true; 148 done = true;
155 break; 149 break;
156 150
157 case BUTTON_NONE: 151 case ACTION_NONE:
158 gui_syncstatusbar_draw(&statusbars, false); 152 gui_syncstatusbar_draw(&statusbars, false);
159 break; 153 break;
160 154
@@ -167,7 +161,7 @@ bool alarm_screen(void)
167 break; 161 break;
168 } 162 }
169 } 163 }
170 164 action_signalscreenchange();
171 return false; 165 return false;
172} 166}
173 167
diff --git a/apps/bookmark.c b/apps/bookmark.c
index 62b286333e..b1fef207a4 100644
--- a/apps/bookmark.c
+++ b/apps/bookmark.c
@@ -24,7 +24,7 @@
24 24
25#include "applimits.h" 25#include "applimits.h"
26#include "lcd.h" 26#include "lcd.h"
27#include "button.h" 27#include "action.h"
28#include "usb.h" 28#include "usb.h"
29#include "audio.h" 29#include "audio.h"
30#include "playlist.h" 30#include "playlist.h"
@@ -458,30 +458,24 @@ bool bookmark_autoload(const char* file)
458 while(!done) 458 while(!done)
459 { 459 {
460 /* Wait for a key to be pushed */ 460 /* Wait for a key to be pushed */
461 key = button_get(true); 461 key = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
462 switch(key) 462 switch(key)
463 { 463 {
464#ifdef HAVE_LCD_BITMAP 464#ifdef HAVE_LCD_BITMAP
465#ifdef BOOKMARK_RC_DOWN 465 case ACTION_STD_NEXT:
466 case BOOKMARK_RC_DOWN:
467#endif
468 case BOOKMARK_DOWN:
469 return bookmark_load(global_bookmark_file_name, false); 466 return bookmark_load(global_bookmark_file_name, false);
470#endif 467#endif
471#ifdef SETTINGS_RC_OK 468 case ACTION_STD_OK:
472 case SETTINGS_RC_OK:
473#endif
474 case SETTINGS_OK:
475 return bookmark_load(global_bookmark_file_name, true); 469 return bookmark_load(global_bookmark_file_name, true);
476 470
477 default: 471 default:
478 /* Handle sys events, ignore button releases & repeats */ 472 /* Handle sys events, ignore button releases & repeats */
479 if (default_event_handler(key) || 473 if (default_event_handler(key))
480 !(key & (BUTTON_REPEAT|BUTTON_REL)))
481 done = true; 474 done = true;
482 break; 475 break;
483 } 476 }
484 } 477 }
478 action_signalscreenchange();
485 return false; 479 return false;
486 } 480 }
487} 481}
@@ -571,7 +565,6 @@ static char* select_bookmark(const char* bookmark_file_name)
571 int bookmark_id = 0; 565 int bookmark_id = 0;
572 int bookmark_id_prev = -1; 566 int bookmark_id_prev = -1;
573 int key; 567 int key;
574 int lastkey = BUTTON_NONE;
575 char* bookmark = NULL; 568 char* bookmark = NULL;
576 int bookmark_count = 0; 569 int bookmark_count = 0;
577 570
@@ -605,6 +598,7 @@ static char* select_bookmark(const char* bookmark_file_name)
605 { 598 {
606 gui_syncsplash(HZ, true, str(LANG_BOOKMARK_LOAD_EMPTY)); 599 gui_syncsplash(HZ, true, str(LANG_BOOKMARK_LOAD_EMPTY));
607 remove(bookmark_file_name); 600 remove(bookmark_file_name);
601 action_signalscreenchange();
608 return NULL; 602 return NULL;
609 } 603 }
610 else 604 else
@@ -621,17 +615,10 @@ static char* select_bookmark(const char* bookmark_file_name)
621 } 615 }
622 616
623 /* waiting for the user to click a button */ 617 /* waiting for the user to click a button */
624 key = button_get(true); 618 key = get_action(CONTEXT_BOOKMARKSCREEN,TIMEOUT_BLOCK);
625 switch(key) 619 switch(key)
626 { 620 {
627#ifdef BOOKMARK_RC_SELECT 621 case ACTION_STD_OK:
628 case BOOKMARK_RC_SELECT:
629#endif
630 case BOOKMARK_SELECT:
631#ifdef BOOKMARK_SELECT_PRE
632 if (lastkey != BOOKMARK_SELECT_PRE)
633 break;
634#endif
635 /* User wants to use this bookmark */ 622 /* User wants to use this bookmark */
636#ifdef HAVE_LCD_BITMAP 623#ifdef HAVE_LCD_BITMAP
637 if (global_settings.statusbar) 624 if (global_settings.statusbar)
@@ -645,11 +632,10 @@ static char* select_bookmark(const char* bookmark_file_name)
645 screens[i].setmargins(0, 0); 632 screens[i].setmargins(0, 0);
646 } 633 }
647#endif 634#endif
635 action_signalscreenchange();
648 return bookmark; 636 return bookmark;
649#ifdef BOOKMARK_RC_DELETE 637
650 case BOOKMARK_RC_DELETE: 638 case ACTION_BMARK_DELETE:
651#endif
652 case BOOKMARK_DELETE:
653 /* User wants to delete this bookmark */ 639 /* User wants to delete this bookmark */
654 delete_bookmark(bookmark_file_name, bookmark_id); 640 delete_bookmark(bookmark_file_name, bookmark_id);
655 bookmark_id_prev=-2; 641 bookmark_id_prev=-2;
@@ -658,54 +644,32 @@ static char* select_bookmark(const char* bookmark_file_name)
658 bookmark_id = bookmark_count -1; 644 bookmark_id = bookmark_count -1;
659 break; 645 break;
660 646
661#ifdef SETTINGS_RC_DEC 647 case ACTION_SETTINGS_DEC:
662 case SETTINGS_RC_DEC:
663 case SETTINGS_RC_DEC | BUTTON_REPEAT:
664#endif
665 case SETTINGS_DEC:
666 case SETTINGS_DEC | BUTTON_REPEAT:
667 bookmark_id--; 648 bookmark_id--;
668 break; 649 break;
669 650
670#ifdef SETTINGS_RC_DEC 651 case ACTION_SETTINGS_INC:
671 case SETTINGS_RC_INC:
672 case SETTINGS_RC_INC | BUTTON_REPEAT:
673#endif
674 case SETTINGS_INC:
675 case SETTINGS_INC | BUTTON_REPEAT:
676 bookmark_id++; 652 bookmark_id++;
677 break; 653 break;
678 654
679#ifdef SETTINGS_RC_CANCEL 655 case ACTION_STD_CANCEL:
680 case SETTINGS_RC_CANCEL:
681#endif
682#ifdef SETTINGS_RC_CANCEL2
683 case SETTINGS_RC_CANCEL2:
684#endif
685 case SETTINGS_CANCEL:
686#ifdef SETTINGS_CANCEL2
687 case SETTINGS_CANCEL2:
688#endif
689#ifdef SETTINGS_RC_OK2
690 case SETTINGS_RC_OK2:
691#endif
692#ifdef SETTINGS_OK2
693 case SETTINGS_OK2:
694#endif
695#ifdef HAVE_LCD_BITMAP 656#ifdef HAVE_LCD_BITMAP
696 FOR_NB_SCREENS(i) 657 FOR_NB_SCREENS(i)
697 screens[i].setmargins(x, y); 658 screens[i].setmargins(x, y);
698#endif 659#endif
660 action_signalscreenchange();
699 return NULL; 661 return NULL;
700 662
701 default: 663 default:
702 if(default_event_handler(key) == SYS_USB_CONNECTED) 664 if(default_event_handler(key) == SYS_USB_CONNECTED)
665 {
666 action_signalscreenchange();
703 return NULL; 667 return NULL;
668 }
704 break; 669 break;
705 } 670 }
706 lastkey = key;
707 } 671 }
708 672 action_signalscreenchange();
709 return NULL; 673 return NULL;
710} 674}
711 675
diff --git a/apps/bookmark.h b/apps/bookmark.h
index 72453aaf7f..16f4e5609f 100644
--- a/apps/bookmark.h
+++ b/apps/bookmark.h
@@ -21,54 +21,6 @@
21 21
22#include <stdbool.h> 22#include <stdbool.h>
23 23
24#if CONFIG_KEYPAD == ONDIO_PAD
25#define BOOKMARK_SELECT_PRE BUTTON_RIGHT
26#define BOOKMARK_SELECT (BUTTON_RIGHT | BUTTON_REL)
27#define BOOKMARK_DELETE (BUTTON_RIGHT | BUTTON_REPEAT)
28#define BOOKMARK_DOWN BUTTON_DOWN
29
30#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
31 (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define BOOKMARK_SELECT BUTTON_SELECT
33#define BOOKMARK_DELETE (BUTTON_ON | BUTTON_SELECT)
34#define BOOKMARK_DOWN BUTTON_DOWN
35#define BOOKMARK_RC_SELECT BUTTON_RC_MENU
36#define BOOKMARK_RC_DELETE (BUTTON_RC_ON | BUTTON_RC_MENU)
37#define BOOKMARK_RC_DOWN BUTTON_RC_FF
38#define BOOKMARK_RC_EXIT BUTTON_RC_STOP
39
40#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
41#define BOOKMARK_SELECT BUTTON_SELECT
42#define BOOKMARK_DELETE (BUTTON_RIGHT | BUTTON_REPEAT)
43#define BOOKMARK_DOWN BUTTON_SCROLL_FWD
44
45#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
46#define BOOKMARK_SELECT BUTTON_SELECT
47#define BOOKMARK_DELETE (BUTTON_PLAY | BUTTON_SELECT)
48#define BOOKMARK_DOWN BUTTON_DOWN
49
50#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
51#define BOOKMARK_SELECT BUTTON_SELECT
52#define BOOKMARK_DELETE BUTTON_REC | BUTTON_REPEAT
53#define BOOKMARK_DOWN BUTTON_DOWN
54
55#elif CONFIG_KEYPAD == GIGABEAT_PAD
56#define BOOKMARK_SELECT BUTTON_MENU
57#define BOOKMARK_DELETE BUTTON_POWER
58#define BOOKMARK_DOWN BUTTON_A
59
60#elif CONFIG_KEYPAD == IRIVER_H10_PAD
61#define BOOKMARK_SELECT BUTTON_PLAY
62#define BOOKMARK_DELETE (BUTTON_FF | BUTTON_REPEAT)
63#define BOOKMARK_DOWN BUTTON_SCROLL_DOWN
64
65#else /* player, recorder, gmini */
66#define BOOKMARK_SELECT BUTTON_PLAY
67#define BOOKMARK_DELETE (BUTTON_ON | BUTTON_PLAY)
68#define BOOKMARK_DOWN BUTTON_DOWN
69
70#endif
71
72bool bookmark_load_menu(void); 24bool bookmark_load_menu(void);
73bool bookmark_autobookmark(void); 25bool bookmark_autobookmark(void);
74bool bookmark_create_menu(void); 26bool bookmark_create_menu(void);
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index e79e88de76..469660cbd0 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -27,7 +27,7 @@
27#include "debug_menu.h" 27#include "debug_menu.h"
28#include "kernel.h" 28#include "kernel.h"
29#include "sprintf.h" 29#include "sprintf.h"
30#include "button.h" 30#include "action.h"
31#include "adc.h" 31#include "adc.h"
32#include "mas.h" 32#include "mas.h"
33#include "power.h" 33#include "power.h"
@@ -86,7 +86,6 @@ extern const char *thread_name[];
86bool dbg_os(void) 86bool dbg_os(void)
87{ 87{
88 char buf[32]; 88 char buf[32];
89 int button;
90 int i; 89 int i;
91 int usage; 90 int usage;
92 91
@@ -106,13 +105,8 @@ bool dbg_os(void)
106 105
107 lcd_update(); 106 lcd_update();
108 107
109 button = button_get_w_tmo(HZ/10); 108 if (action_userabort(TIMEOUT_BLOCK))
110 109 return false;
111 switch(button)
112 {
113 case SETTINGS_CANCEL:
114 return false;
115 }
116 } 110 }
117 return false; 111 return false;
118} 112}
@@ -134,20 +128,21 @@ bool dbg_os(void)
134 snprintf(buf, 32, "%d: %d%% ", currval, usage); 128 snprintf(buf, 32, "%d: %d%% ", currval, usage);
135 lcd_puts(0, 1, buf); 129 lcd_puts(0, 1, buf);
136 130
137 button = button_get_w_tmo(HZ/10); 131 button = get_action(CONTEXT_SETTINGS,HZ/10);
138 132
139 switch(button) 133 switch(button)
140 { 134 {
141 case SETTINGS_CANCEL: 135 case ACTION_STD_CANCEL:
136 action_signalscreenchange();
142 return false; 137 return false;
143 138
144 case SETTINGS_DEC: 139 case ACTION_SETTINGS_DEC:
145 currval--; 140 currval--;
146 if(currval < 0) 141 if(currval < 0)
147 currval = num_threads-1; 142 currval = num_threads-1;
148 break; 143 break;
149 144
150 case SETTINGS_INC: 145 case ACTION_SETTINGS_INC:
151 currval++; 146 currval++;
152 if(currval > num_threads-1) 147 if(currval > num_threads-1)
153 currval = 0; 148 currval = 0;
@@ -163,7 +158,6 @@ bool dbg_os(void)
163bool dbg_audio_thread(void) 158bool dbg_audio_thread(void)
164{ 159{
165 char buf[32]; 160 char buf[32];
166 int button;
167 struct audio_debug d; 161 struct audio_debug d;
168 162
169 lcd_setmargins(0, 0); 163 lcd_setmargins(0, 0);
@@ -171,12 +165,8 @@ bool dbg_audio_thread(void)
171 165
172 while(1) 166 while(1)
173 { 167 {
174 button = button_get_w_tmo(HZ/5); 168 if (action_userabort(HZ/5))
175 switch(button) 169 return false;
176 {
177 case SETTINGS_CANCEL:
178 return false;
179 }
180 170
181 audio_get_debugdata(&d); 171 audio_get_debugdata(&d);
182 172
@@ -242,23 +232,22 @@ bool dbg_audio_thread(void)
242 232
243 lcd_setmargins(0, 0); 233 lcd_setmargins(0, 0);
244 lcd_setfont(FONT_SYSFIXED); 234 lcd_setfont(FONT_SYSFIXED);
245
246 while(!done) 235 while(!done)
247 { 236 {
248 button = button_get_w_tmo(HZ/5); 237 button = get_action(CONTEXT_STD,HZ/5);
249 switch(button) 238 switch(button)
250 { 239 {
251 case SETTINGS_NEXT: 240 case ACTION_STD_NEXT:
252 audio_next(); 241 audio_next();
253 break; 242 break;
254 case SETTINGS_PREV: 243 case ACTION_STD_PREV:
255 audio_prev(); 244 audio_prev();
256 break; 245 break;
257 case SETTINGS_CANCEL: 246 case ACTION_STD_CANCEL:
258 done = true; 247 done = true;
259 break; 248 break;
260 } 249 }
261 250 action_signalscreenchange();
262 line = 0; 251 line = 0;
263 252
264 lcd_clear_display(); 253 lcd_clear_display();
@@ -406,7 +395,6 @@ bool dbg_hw_info(void)
406{ 395{
407#if CONFIG_CPU == SH7034 396#if CONFIG_CPU == SH7034
408 char buf[32]; 397 char buf[32];
409 int button;
410 int usb_polarity; 398 int usb_polarity;
411 int pr_polarity; 399 int pr_polarity;
412 int bitmask = *(unsigned short*)0x20000fc; 400 int bitmask = *(unsigned short*)0x20000fc;
@@ -494,13 +482,11 @@ bool dbg_hw_info(void)
494 482
495 while(1) 483 while(1)
496 { 484 {
497 button = button_get(true); 485 if (action_userabort(TIMEOUT_BLOCK))
498 if(button == SETTINGS_CANCEL)
499 return false; 486 return false;
500 } 487 }
501#elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250 488#elif CONFIG_CPU == MCF5249 || CONFIG_CPU == MCF5250
502 char buf[32]; 489 char buf[32];
503 int button;
504 unsigned manu, id; /* flash IDs */ 490 unsigned manu, id; /* flash IDs */
505 bool got_id; /* flag if we managed to get the flash IDs */ 491 bool got_id; /* flag if we managed to get the flash IDs */
506 int oldmode; /* saved memory guard mode */ 492 int oldmode; /* saved memory guard mode */
@@ -530,13 +516,11 @@ bool dbg_hw_info(void)
530 516
531 while(1) 517 while(1)
532 { 518 {
533 button = button_get(true); 519 if (action_userabort(TIMEOUT_BLOCK))
534 if(button == SETTINGS_CANCEL)
535 return false; 520 return false;
536 } 521 }
537#elif CONFIG_CPU == PP5020 522#elif CONFIG_CPU == PP5020
538 char buf[32]; 523 char buf[32];
539 int button;
540 524
541 lcd_setmargins(0, 0); 525 lcd_setmargins(0, 0);
542 lcd_setfont(FONT_SYSFIXED); 526 lcd_setfont(FONT_SYSFIXED);
@@ -551,8 +535,7 @@ bool dbg_hw_info(void)
551 535
552 while(1) 536 while(1)
553 { 537 {
554 button = button_get(true); 538 if (action_userabort(TIMEOUT_BLOCK))
555 if(button == SETTINGS_CANCEL)
556 return false; 539 return false;
557 } 540 }
558#endif /* CONFIG_CPU */ 541#endif /* CONFIG_CPU */
@@ -641,20 +624,21 @@ bool dbg_hw_info(void)
641 lcd_puts(0, 1, buf); 624 lcd_puts(0, 1, buf);
642 lcd_update(); 625 lcd_update();
643 626
644 button = button_get(true); 627 button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
645 628
646 switch(button) 629 switch(button)
647 { 630 {
648 case SETTINGS_CANCEL: 631 case ACTION_STD_CANCEL:
632 action_signalscreenchange();
649 return false; 633 return false;
650 634
651 case SETTINGS_DEC: 635 case ACTION_SETTINGS_DEC:
652 currval--; 636 currval--;
653 if(currval < 0) 637 if(currval < 0)
654 currval = 5; 638 currval = 5;
655 break; 639 break;
656 640
657 case SETTINGS_INC: 641 case ACTION_SETTINGS_INC:
658 currval++; 642 currval++;
659 if(currval > 5) 643 if(currval > 5)
660 currval = 0; 644 currval = 0;
@@ -688,21 +672,21 @@ bool dbg_partitions(void)
688 lcd_puts(0, 1, buf); 672 lcd_puts(0, 1, buf);
689 lcd_update(); 673 lcd_update();
690 674
691 button = button_get(true); 675 button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
692 676
693 switch(button) 677 switch(button)
694 { 678 {
695 case SETTINGS_OK: 679 case ACTION_STD_CANCEL:
696 case SETTINGS_CANCEL: 680 action_signalscreenchange();
697 return false; 681 return false;
698 682
699 case SETTINGS_DEC: 683 case ACTION_SETTINGS_DEC:
700 partition--; 684 partition--;
701 if (partition < 0) 685 if (partition < 0)
702 partition = 3; 686 partition = 3;
703 break; 687 break;
704 688
705 case SETTINGS_INC: 689 case ACTION_SETTINGS_INC:
706 partition++; 690 partition++;
707 if (partition > 3) 691 if (partition > 3)
708 partition = 0; 692 partition = 0;
@@ -874,13 +858,8 @@ bool dbg_spdif(void)
874 858
875 lcd_update(); 859 lcd_update();
876 860
877 switch (button_get_w_tmo(HZ/10)) 861 if (action_userabort(HZ/2))
878 { 862 return false;
879 case SETTINGS_CANCEL:
880 case SETTINGS_OK2:
881 done = true;
882 break;
883 }
884 } 863 }
885#ifdef HAVE_SPDIF_POWER 864#ifdef HAVE_SPDIF_POWER
886 spdif_power_enable(global_settings.spdif_enable); 865 spdif_power_enable(global_settings.spdif_enable);
@@ -940,13 +919,8 @@ bool dbg_ports(void)
940 lcd_puts(0, 7, buf); 919 lcd_puts(0, 7, buf);
941#endif 920#endif
942 lcd_update(); 921 lcd_update();
943 button = button_get_w_tmo(HZ/10); 922 if (action_userabort(HZ/10))
944 923 return false;
945 switch(button)
946 {
947 case SETTINGS_CANCEL:
948 return false;
949 }
950 } 924 }
951#elif defined(CPU_COLDFIRE) 925#elif defined(CPU_COLDFIRE)
952 unsigned int gpio_out; 926 unsigned int gpio_out;
@@ -962,7 +936,6 @@ bool dbg_ports(void)
962 int adc_remotedetect; 936 int adc_remotedetect;
963#endif 937#endif
964 char buf[128]; 938 char buf[128];
965 int button;
966 int line; 939 int line;
967 int battery_voltage; 940 int battery_voltage;
968 int batt_int, batt_frac; 941 int batt_int, batt_frac;
@@ -1033,13 +1006,8 @@ bool dbg_ports(void)
1033#endif 1006#endif
1034 1007
1035 lcd_update(); 1008 lcd_update();
1036 button = button_get_w_tmo(HZ/10); 1009 if (action_userabort(HZ/10))
1037 1010 return false;
1038 switch(button)
1039 { /* quit on release to allow for reading the cancel button input */
1040 case (SETTINGS_CANCEL|BUTTON_REL):
1041 return false;
1042 }
1043 } 1011 }
1044 1012
1045#elif CONFIG_CPU == PP5020 1013#elif CONFIG_CPU == PP5020
@@ -1049,7 +1017,6 @@ bool dbg_ports(void)
1049 unsigned int gpio_i, gpio_j, gpio_k, gpio_l; 1017 unsigned int gpio_i, gpio_j, gpio_k, gpio_l;
1050 1018
1051 char buf[128]; 1019 char buf[128];
1052 int button;
1053 int line; 1020 int line;
1054 1021
1055 lcd_setmargins(0, 0); 1022 lcd_setmargins(0, 0);
@@ -1091,13 +1058,8 @@ bool dbg_ports(void)
1091 lcd_puts(0, line++, buf); 1058 lcd_puts(0, line++, buf);
1092 1059
1093 lcd_update(); 1060 lcd_update();
1094 button = button_get_w_tmo(HZ/10); 1061 if (action_userabort(HZ/10))
1095 1062 return false;
1096 switch(button)
1097 {
1098 case SETTINGS_CANCEL:
1099 return false;
1100 }
1101 } 1063 }
1102 1064
1103#endif /* CPU */ 1065#endif /* CPU */
@@ -1170,20 +1132,21 @@ bool dbg_ports(void)
1170 snprintf(buf, 32, "Batt: %d.%02dV", batt_int, batt_frac); 1132 snprintf(buf, 32, "Batt: %d.%02dV", batt_int, batt_frac);
1171 lcd_puts(0, 1, buf); 1133 lcd_puts(0, 1, buf);
1172 1134
1173 button = button_get_w_tmo(HZ/5); 1135 button = get_action(CONTEXT_SETTINGS,HZ/5);
1174 1136
1175 switch(button) 1137 switch(button)
1176 { 1138 {
1177 case SETTINGS_CANCEL: 1139 case ACTION_STD_CANCEL:
1140 action_signalscreenchange();
1178 return false; 1141 return false;
1179 1142
1180 case SETTINGS_DEC: 1143 case ACTION_SETTINGS_DEC:
1181 currval--; 1144 currval--;
1182 if(currval < 0) 1145 if(currval < 0)
1183 currval = 10; 1146 currval = 10;
1184 break; 1147 break;
1185 1148
1186 case SETTINGS_INC: 1149 case ACTION_SETTINGS_INC:
1187 currval++; 1150 currval++;
1188 if(currval > 10) 1151 if(currval > 10)
1189 currval = 0; 1152 currval = 0;
@@ -1219,43 +1182,25 @@ bool dbg_cpufreq(void)
1219 lcd_puts(0, line++, buf); 1182 lcd_puts(0, line++, buf);
1220 1183
1221 lcd_update(); 1184 lcd_update();
1222 button = button_get_w_tmo(HZ/10); 1185 button = get_action(CONTEXT_STD,HZ/10);
1223 1186
1224 switch(button) 1187 switch(button)
1225 { 1188 {
1226#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) 1189 case ACTION_STD_PREV:
1227 case BUTTON_MENU: 1190 cpu_boost(true);
1228#else 1191 break;
1229 case BUTTON_UP: 1192 case ACTION_STD_NEXT:
1230#endif 1193 cpu_boost(false);
1231 cpu_boost(true); 1194 break;
1232 break;
1233#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
1234 case BUTTON_PLAY:
1235#else
1236 case BUTTON_DOWN:
1237#endif
1238 cpu_boost(false);
1239 break;
1240 1195
1241#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 1196 case ACTION_STD_OK:
1242 (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ 1197 set_cpu_frequency(CPUFREQ_DEFAULT);
1243 (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) 1198 boost_counter = 0;
1244 case BUTTON_SELECT: 1199 break;
1245#else
1246 case BUTTON_PLAY:
1247#endif
1248 set_cpu_frequency(CPUFREQ_DEFAULT);
1249 boost_counter = 0;
1250 break;
1251 1200
1252#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) 1201 case ACTION_STD_CANCEL:
1253 case BUTTON_LEFT: 1202 action_signalscreenchange();
1254#else 1203 return false;
1255 case SETTINGS_CANCEL:
1256 case SETTINGS_OK2:
1257#endif
1258 return false;
1259 } 1204 }
1260 } 1205 }
1261 1206
@@ -1428,20 +1373,20 @@ bool view_battery(void)
1428 1373
1429 lcd_update(); 1374 lcd_update();
1430 1375
1431 switch(button_get_w_tmo(HZ/2)) 1376 switch(get_action(CONTEXT_SETTINGS,HZ/2))
1432 { 1377 {
1433 case SETTINGS_DEC: 1378 case ACTION_SETTINGS_DEC:
1434 if (view) 1379 if (view)
1435 view--; 1380 view--;
1436 break; 1381 break;
1437 1382
1438 case SETTINGS_INC: 1383 case ACTION_SETTINGS_INC:
1439 if (view < 3) 1384 if (view < 3)
1440 view++; 1385 view++;
1441 break; 1386 break;
1442 1387
1443 case SETTINGS_OK: 1388 case ACTION_STD_CANCEL:
1444 case SETTINGS_CANCEL: 1389 action_signalscreenchange();
1445 return false; 1390 return false;
1446 } 1391 }
1447 } 1392 }
@@ -1498,41 +1443,40 @@ static bool view_runtime(void)
1498 lcd_update(); 1443 lcd_update();
1499 1444
1500 /* Wait for a key to be pushed */ 1445 /* Wait for a key to be pushed */
1501 key = button_get_w_tmo(HZ); 1446 key = get_action(CONTEXT_SETTINGS,HZ);
1502 switch(key) { 1447 switch(key) {
1503 case SETTINGS_CANCEL: 1448 case ACTION_STD_CANCEL:
1504 done = true; 1449 done = true;
1505 break; 1450 break;
1506 1451
1507 case SETTINGS_INC: 1452 case ACTION_SETTINGS_INC:
1508 case SETTINGS_DEC: 1453 case ACTION_SETTINGS_DEC:
1509 if (state == 1) 1454 if (state == 1)
1510 state = 2; 1455 state = 2;
1511 else 1456 else
1512 state = 1; 1457 state = 1;
1513 break; 1458 break;
1514 1459
1515 case SETTINGS_OK: 1460 case ACTION_STD_OK:
1516 lcd_clear_display(); 1461 lcd_clear_display();
1462 /*NOTE: this needs to be changed to sync splash! */
1517 lcd_puts(0,0,"Clear time?"); 1463 lcd_puts(0,0,"Clear time?");
1518 lcd_puts(0,1,"PLAY = Yes"); 1464 lcd_puts(0,1,"PLAY = Yes");
1519 lcd_update(); 1465 lcd_update();
1520 while (1) { 1466 while (1) {
1521 key = button_get(true); 1467 key = get_action(CONTEXT_STD,TIMEOUT_BLOCK);
1522 if ( key == SETTINGS_OK ) { 1468 if ( key == ACTION_STD_OK ) {
1523 if ( state == 1 ) 1469 if ( state == 1 )
1524 global_settings.runtime = 0; 1470 global_settings.runtime = 0;
1525 else 1471 else
1526 global_settings.topruntime = 0; 1472 global_settings.topruntime = 0;
1527 break; 1473 break;
1528 } 1474 }
1529 if (!(key & BUTTON_REL)) /* ignore button releases */
1530 break;
1531 } 1475 }
1532 break; 1476 break;
1533 } 1477 }
1534 } 1478 }
1535 1479 action_signalscreenchange();
1536 return false; 1480 return false;
1537} 1481}
1538 1482
@@ -1620,27 +1564,26 @@ bool dbg_mmc_info(void)
1620 1564
1621 lcd_update(); 1565 lcd_update();
1622 1566
1623 switch (button_get_w_tmo(HZ/2)) 1567 switch (get_action(CONTEXT_SETTINGS,HZ/2))
1624 { 1568 {
1625 case SETTINGS_OK: 1569 case ACTION_STD_CANCEL:
1626 case SETTINGS_CANCEL:
1627 done = true; 1570 done = true;
1628 break; 1571 break;
1629 1572
1630 case SETTINGS_DEC: 1573 case ACTION_SETTINGS_DEC:
1631 currval--; 1574 currval--;
1632 if (currval < 0) 1575 if (currval < 0)
1633 currval = 3; 1576 currval = 3;
1634 break; 1577 break;
1635 1578
1636 case SETTINGS_INC: 1579 case ACTION_SETTINGS_INC:
1637 currval++; 1580 currval++;
1638 if (currval > 3) 1581 if (currval > 3)
1639 currval = 0; 1582 currval = 0;
1640 break; 1583 break;
1641 } 1584 }
1642 } 1585 }
1643 1586 action_signalscreenchange();
1644 return false; 1587 return false;
1645} 1588}
1646#else /* !HAVE_MMC */ 1589#else /* !HAVE_MMC */
@@ -1781,26 +1724,25 @@ static bool dbg_disk_info(void)
1781 lcd_update(); 1724 lcd_update();
1782 1725
1783 /* Wait for a key to be pushed */ 1726 /* Wait for a key to be pushed */
1784 key = button_get_w_tmo(HZ*5); 1727 key = get_action(CONTEXT_SETTINGS,HZ/5);
1785 switch(key) { 1728 switch(key) {
1786 case SETTINGS_OK: 1729 case ACTION_STD_CANCEL:
1787 case SETTINGS_CANCEL:
1788 done = true; 1730 done = true;
1789 break; 1731 break;
1790 1732
1791 case SETTINGS_DEC: 1733 case ACTION_SETTINGS_DEC:
1792 if (--page < 0) 1734 if (--page < 0)
1793 page = max_page; 1735 page = max_page;
1794 break; 1736 break;
1795 1737
1796 case SETTINGS_INC: 1738 case ACTION_SETTINGS_INC:
1797 if (++page > max_page) 1739 if (++page > max_page)
1798 page = 0; 1740 page = 0;
1799 break; 1741 break;
1800 } 1742 }
1801 lcd_stop_scroll(); 1743 lcd_stop_scroll();
1802 } 1744 }
1803 1745 action_signalscreenchange();
1804 return false; 1746 return false;
1805} 1747}
1806#endif /* !HAVE_MMC */ 1748#endif /* !HAVE_MMC */
@@ -1849,13 +1791,8 @@ static bool dbg_dircache_info(void)
1849 1791
1850 lcd_update(); 1792 lcd_update();
1851 1793
1852 switch (button_get_w_tmo(HZ/2)) 1794 if (action_userabort(HZ/2))
1853 { 1795 return false;
1854 case SETTINGS_OK:
1855 case SETTINGS_CANCEL:
1856 done = true;
1857 break;
1858 }
1859 } 1796 }
1860 1797
1861 return false; 1798 return false;
@@ -1900,13 +1837,8 @@ static bool dbg_tagcache_info(void)
1900 1837
1901 lcd_update(); 1838 lcd_update();
1902 1839
1903 switch (button_get_w_tmo(HZ/2)) 1840 if (action_userabort(HZ/2))
1904 { 1841 return false;
1905 case SETTINGS_OK:
1906 case SETTINGS_CANCEL:
1907 done = true;
1908 break;
1909 }
1910 } 1842 }
1911 1843
1912 return false; 1844 return false;
@@ -1979,7 +1911,6 @@ bool dbg_save_roms(void)
1979bool dbg_fm_radio(void) 1911bool dbg_fm_radio(void)
1980{ 1912{
1981 char buf[32]; 1913 char buf[32];
1982 int button;
1983 bool fm_detected; 1914 bool fm_detected;
1984 1915
1985#ifdef HAVE_LCD_BITMAP 1916#ifdef HAVE_LCD_BITMAP
@@ -2010,13 +1941,8 @@ bool dbg_fm_radio(void)
2010 1941
2011 lcd_update(); 1942 lcd_update();
2012 1943
2013 button = button_get_w_tmo(HZ); 1944 if (action_userabort(TIMEOUT_BLOCK))
2014 1945 return false;
2015 switch(button)
2016 {
2017 case SETTINGS_CANCEL:
2018 return false;
2019 }
2020 } 1946 }
2021 return false; 1947 return false;
2022} 1948}
diff --git a/apps/eq_menu.c b/apps/eq_menu.c
index 32d16c47e1..7c8b1590c3 100644
--- a/apps/eq_menu.c
+++ b/apps/eq_menu.c
@@ -26,7 +26,7 @@
26#include "kernel.h" 26#include "kernel.h"
27#include "lcd.h" 27#include "lcd.h"
28#include "menu.h" 28#include "menu.h"
29#include "button.h" 29#include "action.h"
30#include "mp3_playback.h" 30#include "mp3_playback.h"
31#include "settings.h" 31#include "settings.h"
32#include "statusbar.h" 32#include "statusbar.h"
@@ -49,73 +49,6 @@
49#include "wm8758.h" 49#include "wm8758.h"
50#endif 50#endif
51 51
52/* Key definitions */
53#if (CONFIG_KEYPAD == IRIVER_H100_PAD || \
54 CONFIG_KEYPAD == IRIVER_H300_PAD)
55
56#define EQ_BTN_MODIFIER BUTTON_ON
57#define EQ_BTN_DECREMENT BUTTON_LEFT
58#define EQ_BTN_INCREMENT BUTTON_RIGHT
59#define EQ_BTN_NEXT_BAND BUTTON_DOWN
60#define EQ_BTN_PREV_BAND BUTTON_UP
61#define EQ_BTN_CHANGE_MODE BUTTON_SELECT
62#define EQ_BTN_EXIT BUTTON_OFF
63
64#define EQ_BTN_RC_PREV_BAND BUTTON_RC_REW
65#define EQ_BTN_RC_NEXT_BAND BUTTON_RC_FF
66#define EQ_BTN_RC_DECREMENT BUTTON_RC_SOURCE
67#define EQ_BTN_RC_INCREMENT BUTTON_RC_BITRATE
68#define EQ_BTN_RC_CHANGE_MODE BUTTON_RC_MENU
69#define EQ_BTN_RC_EXIT BUTTON_RC_STOP
70
71#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
72 (CONFIG_KEYPAD == IPOD_3G_PAD)
73
74#define EQ_BTN_DECREMENT BUTTON_SCROLL_BACK
75#define EQ_BTN_INCREMENT BUTTON_SCROLL_FWD
76#define EQ_BTN_NEXT_BAND BUTTON_RIGHT
77#define EQ_BTN_PREV_BAND BUTTON_LEFT
78#define EQ_BTN_CHANGE_MODE BUTTON_SELECT
79#define EQ_BTN_EXIT BUTTON_MENU
80
81#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
82
83#define EQ_BTN_DECREMENT BUTTON_LEFT
84#define EQ_BTN_INCREMENT BUTTON_RIGHT
85#define EQ_BTN_NEXT_BAND BUTTON_DOWN
86#define EQ_BTN_PREV_BAND BUTTON_UP
87#define EQ_BTN_CHANGE_MODE BUTTON_REC
88#define EQ_BTN_EXIT BUTTON_SELECT
89
90#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
91
92#define EQ_BTN_DECREMENT BUTTON_LEFT
93#define EQ_BTN_INCREMENT BUTTON_RIGHT
94#define EQ_BTN_NEXT_BAND BUTTON_DOWN
95#define EQ_BTN_PREV_BAND BUTTON_UP
96#define EQ_BTN_CHANGE_MODE BUTTON_SELECT
97#define EQ_BTN_EXIT BUTTON_PLAY
98
99#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
100
101#define EQ_BTN_DECREMENT BUTTON_LEFT
102#define EQ_BTN_INCREMENT BUTTON_RIGHT
103#define EQ_BTN_NEXT_BAND BUTTON_DOWN
104#define EQ_BTN_PREV_BAND BUTTON_UP
105#define EQ_BTN_CHANGE_MODE BUTTON_SELECT
106#define EQ_BTN_EXIT BUTTON_A
107
108#elif CONFIG_KEYPAD == IRIVER_H10_PAD
109
110#define EQ_BTN_DECREMENT BUTTON_LEFT
111#define EQ_BTN_INCREMENT BUTTON_RIGHT
112#define EQ_BTN_NEXT_BAND BUTTON_SCROLL_DOWN
113#define EQ_BTN_PREV_BAND BUTTON_SCROLL_UP
114#define EQ_BTN_CHANGE_MODE BUTTON_PLAY
115#define EQ_BTN_EXIT BUTTON_POWER
116
117#endif
118
119/* Various user interface limits and sizes */ 52/* Various user interface limits and sizes */
120#define EQ_CUTOFF_MIN 20 53#define EQ_CUTOFF_MIN 20
121#define EQ_CUTOFF_MAX 22040 54#define EQ_CUTOFF_MAX 22040
@@ -686,27 +619,19 @@ bool eq_menu_graphical(void)
686 screens[i].update(); 619 screens[i].update();
687 } 620 }
688 621
689 button = button_get(true); 622 button = get_action(CONTEXT_SETTINGSGRAPHICAL,TIMEOUT_BLOCK);
690 623
691 switch (button) { 624 switch (button) {
692 case EQ_BTN_DECREMENT: 625 case ACTION_SETTINGS_DEC:
693 case EQ_BTN_DECREMENT | BUTTON_REPEAT: 626 case ACTION_SETTINGS_DECREPEAT:
694#ifdef EQ_BTN_RC_DECREMENT
695 case EQ_BTN_RC_DECREMENT:
696 case EQ_BTN_RC_DECREMENT | BUTTON_REPEAT:
697#endif
698 *(setting) -= step; 627 *(setting) -= step;
699 has_changed = true; 628 has_changed = true;
700 if (*(setting) < min) 629 if (*(setting) < min)
701 *(setting) = min; 630 *(setting) = min;
702 break; 631 break;
703 632
704 case EQ_BTN_INCREMENT: 633 case ACTION_SETTINGS_INC:
705 case EQ_BTN_INCREMENT | BUTTON_REPEAT: 634 case ACTION_SETTINGS_INCREPEAT:
706#ifdef EQ_BTN_RC_INCREMENT
707 case EQ_BTN_RC_INCREMENT:
708 case EQ_BTN_RC_INCREMENT | BUTTON_REPEAT:
709#endif
710 *(setting) += step; 635 *(setting) += step;
711 has_changed = true; 636 has_changed = true;
712 if (*(setting) > max) 637 if (*(setting) > max)
@@ -731,45 +656,27 @@ bool eq_menu_graphical(void)
731 break; 656 break;
732#endif 657#endif
733 658
734 case EQ_BTN_PREV_BAND: 659 case ACTION_STD_PREV:
735 case EQ_BTN_PREV_BAND | BUTTON_REPEAT: 660 case ACTION_STD_PREVREPEAT:
736#ifdef EQ_BTN_RC_PREV_BAND
737 case EQ_BTN_RC_PREV_BAND:
738 case EQ_BTN_RC_PREV_BAND | BUTTON_REPEAT:
739#endif
740 current_band--; 661 current_band--;
741 if (current_band < 0) 662 if (current_band < 0)
742 current_band = 4; /* wrap around */ 663 current_band = 4; /* wrap around */
743 break; 664 break;
744 665
745 case EQ_BTN_NEXT_BAND: 666 case ACTION_STD_NEXT:
746 case EQ_BTN_NEXT_BAND | BUTTON_REPEAT: 667 case ACTION_STD_NEXTREPEAT:
747#ifdef EQ_BTN_RC_NEXT_BAND
748 case EQ_BTN_RC_NEXT_BAND:
749 case EQ_BTN_RC_NEXT_BAND | BUTTON_REPEAT:
750#endif
751 current_band++; 668 current_band++;
752 if (current_band > 4) 669 if (current_band > 4)
753 current_band = 0; /* wrap around */ 670 current_band = 0; /* wrap around */
754 break; 671 break;
755 672
756 case EQ_BTN_CHANGE_MODE: 673 case ACTION_STD_OK:
757 case EQ_BTN_CHANGE_MODE | BUTTON_REPEAT:
758#ifdef EQ_BTN_RC_CHANGE_MODE
759 case EQ_BTN_RC_CHANGE_MODE:
760 case EQ_BTN_RC_CHANGE_MODE | BUTTON_REPEAT:
761#endif
762 mode++; 674 mode++;
763 if (mode > Q) 675 if (mode > Q)
764 mode = GAIN; /* wrap around */ 676 mode = GAIN; /* wrap around */
765 break; 677 break;
766 678
767 case EQ_BTN_EXIT: 679 case ACTION_STD_CANCEL:
768 case EQ_BTN_EXIT | BUTTON_REPEAT:
769#ifdef EQ_BTN_RC_EXIT
770 case EQ_BTN_RC_EXIT:
771 case EQ_BTN_RC_EXIT | BUTTON_REPEAT:
772#endif
773 exit_request = true; 680 exit_request = true;
774 result = false; 681 result = false;
775 break; 682 break;
@@ -789,6 +696,7 @@ bool eq_menu_graphical(void)
789 } 696 }
790 } 697 }
791 698
699 action_signalscreenchange();
792 /* Reset screen settings */ 700 /* Reset screen settings */
793 FOR_NB_SCREENS(i) { 701 FOR_NB_SCREENS(i) {
794 screens[i].setfont(FONT_UI); 702 screens[i].setfont(FONT_UI);
diff --git a/apps/gui/color_picker.c b/apps/gui/color_picker.c
index 4618cb6bc0..3decd30207 100644
--- a/apps/gui/color_picker.c
+++ b/apps/gui/color_picker.c
@@ -29,64 +29,11 @@
29#include "scrollbar.h" 29#include "scrollbar.h"
30#include "lang.h" 30#include "lang.h"
31#include "splash.h" 31#include "splash.h"
32#include "action.h"
32 33
33#define TEXT_MARGIN display->char_width+2 34#define TEXT_MARGIN display->char_width+2
34#define SLIDER_START 20 35#define SLIDER_START 20
35 36
36#if (CONFIG_KEYPAD == IRIVER_H300_PAD)
37#define SLIDER_UP BUTTON_UP
38#define SLIDER_DOWN BUTTON_DOWN
39#define SLIDER_LEFT BUTTON_LEFT
40#define SLIDER_RIGHT BUTTON_RIGHT
41#define SLIDER_OK BUTTON_ON
42#define SLIDER_OK2 BUTTON_SELECT
43#define SLIDER_CANCEL BUTTON_OFF
44
45#define SLIDER_RC_UP BUTTON_RC_REW
46#define SLIDER_RC_DOWN BUTTON_RC_FF
47#define SLIDER_RC_LEFT BUTTON_RC_SOURCE
48#define SLIDER_RC_RIGHT BUTTON_RC_BITRATE
49#define SLIDER_RC_OK BUTTON_RC_ON
50#define SLIDER_RC_CANCEL BUTTON_RC_STOP
51
52#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
53#define SLIDER_UP BUTTON_UP
54#define SLIDER_DOWN BUTTON_DOWN
55#define SLIDER_LEFT BUTTON_LEFT
56#define SLIDER_RIGHT BUTTON_RIGHT
57#define SLIDER_OK BUTTON_POWER
58#define SLIDER_CANCEL BUTTON_A
59
60#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
61#define SLIDER_UP BUTTON_LEFT
62#define SLIDER_DOWN BUTTON_RIGHT
63#define SLIDER_LEFT BUTTON_SCROLL_BACK
64#define SLIDER_RIGHT BUTTON_SCROLL_FWD
65#define SLIDER_OK BUTTON_SELECT
66#define SLIDER_CANCEL BUTTON_MENU
67
68#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
69#define SLIDER_UP BUTTON_UP
70#define SLIDER_DOWN BUTTON_DOWN
71#define SLIDER_LEFT BUTTON_LEFT
72#define SLIDER_RIGHT BUTTON_RIGHT
73#define SLIDER_OK BUTTON_SELECT
74#define SLIDER_CANCEL BUTTON_PLAY
75
76/* FIXME: chosen at will to make it compile */
77#define SLIDER_RC_OK BUTTON_RC_PLAY
78#define SLIDER_RC_CANCEL BUTTON_RC_REC
79
80#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
81#define SLIDER_UP BUTTON_SCROLL_UP
82#define SLIDER_DOWN BUTTON_SCROLL_DOWN
83#define SLIDER_LEFT BUTTON_LEFT
84#define SLIDER_RIGHT BUTTON_RIGHT
85#define SLIDER_OK BUTTON_PLAY
86#define SLIDER_CANCEL BUTTON_POWER
87
88#endif
89
90static const int max_val[3] = {LCD_MAX_RED,LCD_MAX_GREEN,LCD_MAX_BLUE}; 37static const int max_val[3] = {LCD_MAX_RED,LCD_MAX_GREEN,LCD_MAX_BLUE};
91 38
92static void draw_screen(struct screen *display, char *title, 39static void draw_screen(struct screen *display, char *title,
@@ -237,50 +184,30 @@ bool set_color(struct screen *display,char *title, int* color, int banned_color)
237 draw_screen(&screens[i], title, rgb_val, newcolor, slider); 184 draw_screen(&screens[i], title, rgb_val, newcolor, slider);
238 } 185 }
239 186
240 button = button_get(true); 187 button = get_action(CONTEXT_SETTINGSGRAPHICAL,TIMEOUT_BLOCK);
241 switch (button) 188 switch (button)
242 { 189 {
243 case SLIDER_UP: 190 case ACTION_STD_PREV:
244#ifdef SLIDER_RC_UP
245 case SLIDER_RC_UP:
246#endif
247 slider = (slider+2)%3; 191 slider = (slider+2)%3;
248 break; 192 break;
249 193
250 case SLIDER_DOWN: 194 case ACTION_STD_NEXT:
251#ifdef SLIDER_RC_DOWN
252 case SLIDER_RC_DOWN:
253#endif
254 slider = (slider+1)%3; 195 slider = (slider+1)%3;
255 break; 196 break;
256 197
257 case SLIDER_RIGHT: 198 case ACTION_SETTINGS_INC:
258 case SLIDER_RIGHT|BUTTON_REPEAT: 199 case ACTION_SETTINGS_INCREPEAT:
259#ifdef SLIDER_RC_RIGHT
260 case SLIDER_RC_RIGHT:
261 case SLIDER_RC_RIGHT|BUTTON_REPEAT:
262#endif
263 if (rgb_val[slider] < max_val[slider]) 200 if (rgb_val[slider] < max_val[slider])
264 rgb_val[slider]++; 201 rgb_val[slider]++;
265 break; 202 break;
266 203
267 case SLIDER_LEFT: 204 case ACTION_SETTINGS_DEC:
268 case SLIDER_LEFT|BUTTON_REPEAT: 205 case ACTION_SETTINGS_DECREPEAT:
269#ifdef SLIDER_RC_LEFT
270 case SLIDER_RC_LEFT:
271 case SLIDER_RC_LEFT|BUTTON_REPEAT:
272#endif
273 if (rgb_val[slider] > 0) 206 if (rgb_val[slider] > 0)
274 rgb_val[slider]--; 207 rgb_val[slider]--;
275 break; 208 break;
276 209
277 case SLIDER_OK: 210 case ACTION_STD_OK:
278#ifdef HAVE_REMOTE_LCD
279 case SLIDER_RC_OK:
280#endif
281#ifdef SLIDER_OK2
282 case SLIDER_OK2:
283#endif
284 if ((banned_color!=-1) && (banned_color == newcolor)) 211 if ((banned_color!=-1) && (banned_color == newcolor))
285 { 212 {
286 gui_syncsplash(HZ*2,true,str(LANG_COLOR_UNACCEPTABLE)); 213 gui_syncsplash(HZ*2,true,str(LANG_COLOR_UNACCEPTABLE));
@@ -290,10 +217,7 @@ bool set_color(struct screen *display,char *title, int* color, int banned_color)
290 exit = 1; 217 exit = 1;
291 break; 218 break;
292 219
293 case SLIDER_CANCEL: 220 case ACTION_STD_CANCEL:
294#ifdef HAVE_REMOTE_LCD
295 case SLIDER_RC_CANCEL:
296#endif
297 exit = 1; 221 exit = 1;
298 break; 222 break;
299 223
@@ -306,6 +230,6 @@ bool set_color(struct screen *display,char *title, int* color, int banned_color)
306 } 230 }
307 } 231 }
308 display->set_foreground(fgcolor); 232 display->set_foreground(fgcolor);
309 233 action_signalscreenchange();
310 return false; 234 return false;
311} 235}
diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c
index d83ac55787..72ad4d6e93 100644
--- a/apps/gui/gwps-common.c
+++ b/apps/gui/gwps-common.c
@@ -52,6 +52,7 @@
52#include "backdrop.h" 52#include "backdrop.h"
53#endif 53#endif
54#include "dsp.h" 54#include "dsp.h"
55#include "action.h"
55 56
56#ifdef HAVE_LCD_CHARCELLS 57#ifdef HAVE_LCD_CHARCELLS
57static bool draw_player_progress(struct gui_wps *gwps); 58static bool draw_player_progress(struct gui_wps *gwps);
@@ -2319,19 +2320,18 @@ bool ffwd_rew(int button)
2319 bool usb = false; 2320 bool usb = false;
2320 int i = 0; 2321 int i = 0;
2321 2322
2323 if (button == ACTION_NONE)
2324 {
2325 status_set_ffmode(0);
2326 return usb;
2327 }
2322 while (!exit) 2328 while (!exit)
2323 { 2329 {
2324 switch ( button ) 2330 switch ( button )
2325 { 2331 {
2326 case WPS_FFWD: 2332 case ACTION_WPS_SEEKFWD:
2327#ifdef WPS_RC_FFWD
2328 case WPS_RC_FFWD:
2329#endif
2330 direction = 1; 2333 direction = 1;
2331 case WPS_REW: 2334 case ACTION_WPS_SEEKBACK:
2332#ifdef WPS_RC_REW
2333 case WPS_RC_REW:
2334#endif
2335 if (wps_state.ff_rewind) 2335 if (wps_state.ff_rewind)
2336 { 2336 {
2337 if (direction == 1) 2337 if (direction == 1)
@@ -2415,12 +2415,7 @@ bool ffwd_rew(int button)
2415 2415
2416 break; 2416 break;
2417 2417
2418 case WPS_PREV: 2418 case ACTION_WPS_STOPSEEK:
2419 case WPS_NEXT:
2420#ifdef WPS_RC_PREV
2421 case WPS_RC_PREV:
2422 case WPS_RC_NEXT:
2423#endif
2424 wps_state.id3->elapsed = wps_state.id3->elapsed+ff_rewind_count; 2419 wps_state.id3->elapsed = wps_state.id3->elapsed+ff_rewind_count;
2425 audio_ff_rewind(wps_state.id3->elapsed); 2420 audio_ff_rewind(wps_state.id3->elapsed);
2426 ff_rewind_count = 0; 2421 ff_rewind_count = 0;
@@ -2445,9 +2440,9 @@ bool ffwd_rew(int button)
2445 break; 2440 break;
2446 } 2441 }
2447 if (!exit) 2442 if (!exit)
2448 button = button_get(true); 2443 button = get_action(CONTEXT_WPS,TIMEOUT_BLOCK);
2449 } 2444 }
2450 2445 action_signalscreenchange();
2451 return usb; 2446 return usb;
2452} 2447}
2453 2448
@@ -2547,7 +2542,7 @@ bool update(struct gui_wps *gwps)
2547 return retcode; 2542 return retcode;
2548} 2543}
2549 2544
2550#ifdef WPS_KEYLOCK 2545
2551void display_keylock_text(bool locked) 2546void display_keylock_text(bool locked)
2552{ 2547{
2553 char* s; 2548 char* s;
@@ -2569,11 +2564,3 @@ void display_keylock_text(bool locked)
2569 gui_syncsplash(HZ, true, s); 2564 gui_syncsplash(HZ, true, s);
2570} 2565}
2571 2566
2572void waitfor_nokey(void)
2573{
2574 /* wait until all keys are released */
2575 while (button_get(false) != BUTTON_NONE)
2576 yield();
2577}
2578#endif
2579
diff --git a/apps/gui/gwps-common.h b/apps/gui/gwps-common.h
index ecda1d47ea..b4d6df589a 100644
--- a/apps/gui/gwps-common.h
+++ b/apps/gui/gwps-common.h
@@ -35,9 +35,6 @@ bool update(struct gui_wps *gwps);
35bool ffwd_rew(int button); 35bool ffwd_rew(int button);
36bool wps_data_preload_tags(struct wps_data *data, char *buf, 36bool wps_data_preload_tags(struct wps_data *data, char *buf,
37 const char *bmpdir, size_t bmpdirlen); 37 const char *bmpdir, size_t bmpdirlen);
38#ifdef WPS_KEYLOCK
39void display_keylock_text(bool locked); 38void display_keylock_text(bool locked);
40void waitfor_nokey(void);
41#endif
42#endif 39#endif
43 40
diff --git a/apps/gui/gwps.c b/apps/gui/gwps.c
index 1b19c13547..bd9bb5e07b 100644
--- a/apps/gui/gwps.c
+++ b/apps/gui/gwps.c
@@ -25,7 +25,7 @@
25#include "lcd.h" 25#include "lcd.h"
26#include "font.h" 26#include "font.h"
27#include "backlight.h" 27#include "backlight.h"
28#include "button.h" 28#include "action.h"
29#include "kernel.h" 29#include "kernel.h"
30#include "tree.h" 30#include "tree.h"
31#include "debug.h" 31#include "debug.h"
@@ -84,14 +84,11 @@ static void gui_wps_set_margin(struct gui_wps *gwps)
84 84
85long gui_wps_show(void) 85long gui_wps_show(void)
86{ 86{
87 long button = 0, lastbutton = 0; 87 long button = 0;
88 bool ignore_keyup = true;
89 bool restore = false; 88 bool restore = false;
90 long restoretimer = 0; /* timer to delay screen redraw temporarily */ 89 long restoretimer = 0; /* timer to delay screen redraw temporarily */
91 bool exit = false; 90 bool exit = false;
92 bool update_track = false; 91 bool update_track = false;
93 unsigned long right_lastclick = 0;
94 unsigned long left_lastclick = 0;
95 int i; 92 int i;
96 93
97 wps_state_init(); 94 wps_state_init();
@@ -163,8 +160,8 @@ long gui_wps_show(void)
163 long next_big_refresh = current_tick + HZ / 5; 160 long next_big_refresh = current_tick + HZ / 5;
164 button = BUTTON_NONE; 161 button = BUTTON_NONE;
165 while (TIME_BEFORE(current_tick, next_big_refresh)) { 162 while (TIME_BEFORE(current_tick, next_big_refresh)) {
166 button = button_get(false); 163 button = get_action(CONTEXT_WPS,TIMEOUT_NOBLOCK);
167 if (button != BUTTON_NONE) { 164 if (button != ACTION_NONE) {
168 break; 165 break;
169 } 166 }
170 peak_meter_peek(); 167 peak_meter_peek();
@@ -186,35 +183,10 @@ long gui_wps_show(void)
186 /* The peak meter is disabled 183 /* The peak meter is disabled
187 -> no additional screen updates needed */ 184 -> no additional screen updates needed */
188 else { 185 else {
189 button = button_get_w_tmo(HZ/5); 186 button = get_action(CONTEXT_WPS,HZ/5);
190 } 187 }
191#else 188#else
192 button = button_get_w_tmo(HZ/5); 189 button = get_action(CONTEXT_WPS,HZ/5);
193#endif
194
195 /* discard first event if it's a button release */
196 if (button && ignore_keyup)
197 {
198 ignore_keyup = false;
199 /* Negative events are system events */
200 if (button >= 0 && button & BUTTON_REL )
201 continue;
202 }
203
204#ifdef WPS_KEYLOCK
205 /* ignore non-remote buttons when keys are locked */
206 if (keys_locked &&
207 ! ((button < 0) ||
208 (button == BUTTON_NONE) ||
209 ((button & WPS_KEYLOCK) == WPS_KEYLOCK) ||
210 (button & BUTTON_REMOTE)
211 ))
212 {
213 if (!(button & BUTTON_REL))
214 display_keylock_text(true);
215 restore = true;
216 button = BUTTON_NONE;
217 }
218#endif 190#endif
219 191
220 /* Exit if audio has stopped playing. This can happen if using the 192 /* Exit if audio has stopped playing. This can happen if using the
@@ -222,17 +194,14 @@ long gui_wps_show(void)
222 from F1 */ 194 from F1 */
223 if (!audio_status()) 195 if (!audio_status())
224 exit = true; 196 exit = true;
225 197
226 switch(button) 198 switch(button)
227 { 199 {
228#ifdef WPS_CONTEXT 200 case ACTION_WPS_CONTEXT:
229 case WPS_CONTEXT:
230#ifdef WPS_RC_CONTEXT
231 case WPS_RC_CONTEXT:
232#endif
233#ifdef HAVE_LCD_COLOR 201#ifdef HAVE_LCD_COLOR
234 show_main_backdrop(); 202 show_main_backdrop();
235#endif 203#endif
204 action_signalscreenchange();
236 onplay(wps_state.id3->path, TREE_ATTR_MPA, CONTEXT_WPS); 205 onplay(wps_state.id3->path, TREE_ATTR_MPA, CONTEXT_WPS);
237#ifdef HAVE_LCD_COLOR 206#ifdef HAVE_LCD_COLOR
238 show_wps_backdrop(); 207 show_wps_backdrop();
@@ -245,20 +214,8 @@ long gui_wps_show(void)
245#endif 214#endif
246 restore = true; 215 restore = true;
247 break; 216 break;
248#endif
249 217
250#ifdef WPS_RC_BROWSE 218 case ACTION_WPS_BROWSE:
251 case WPS_RC_BROWSE:
252#endif
253 case WPS_BROWSE:
254#ifdef WPS_BROWSE_PRE
255 if ((lastbutton != WPS_BROWSE_PRE)
256#ifdef WPS_RC_BROWSE_PRE
257 && (lastbutton != WPS_RC_BROWSE_PRE)
258#endif
259 )
260 break;
261#endif
262#ifdef HAVE_LCD_CHARCELLS 219#ifdef HAVE_LCD_CHARCELLS
263 status_set_record(false); 220 status_set_record(false);
264 status_set_audio(false); 221 status_set_audio(false);
@@ -270,26 +227,14 @@ long gui_wps_show(void)
270 if (global_settings.browse_current && 227 if (global_settings.browse_current &&
271 wps_state.current_track_path[0] != '\0') 228 wps_state.current_track_path[0] != '\0')
272 set_current_file(wps_state.current_track_path); 229 set_current_file(wps_state.current_track_path);
273 230 action_signalscreenchange();
274 return 0; 231 return 0;
275 break; 232 break;
276 233
277 /* play/pause */ 234 /* play/pause */
278 case WPS_PAUSE: 235 case ACTION_WPS_PLAY:
279#ifdef WPS_PAUSE_PRE
280 if (lastbutton != WPS_PAUSE_PRE)
281 break;
282#endif
283#ifdef WPS_RC_PAUSE
284 case WPS_RC_PAUSE:
285 if (global_settings.party_mode) 236 if (global_settings.party_mode)
286 break; 237 break;
287#ifdef WPS_RC_PAUSE_PRE
288 if ((button == WPS_RC_PAUSE) &&
289 (lastbutton != WPS_RC_PAUSE_PRE))
290 break;
291#endif
292#endif
293 if ( wps_state.paused ) 238 if ( wps_state.paused )
294 { 239 {
295 wps_state.paused = false; 240 wps_state.paused = false;
@@ -313,12 +258,7 @@ long gui_wps_show(void)
313 break; 258 break;
314 259
315 /* volume up */ 260 /* volume up */
316 case WPS_INCVOL: 261 case ACTION_WPS_VOLUP:
317 case WPS_INCVOL | BUTTON_REPEAT:
318#ifdef WPS_RC_INCVOL
319 case WPS_RC_INCVOL:
320 case WPS_RC_INCVOL | BUTTON_REPEAT:
321#endif
322 { 262 {
323 global_settings.volume++; 263 global_settings.volume++;
324 bool res = false; 264 bool res = false;
@@ -336,12 +276,7 @@ long gui_wps_show(void)
336 break; 276 break;
337 277
338 /* volume down */ 278 /* volume down */
339 case WPS_DECVOL: 279 case ACTION_WPS_VOLDOWN:
340 case WPS_DECVOL | BUTTON_REPEAT:
341#ifdef WPS_RC_DECVOL
342 case WPS_RC_DECVOL:
343 case WPS_RC_DECVOL | BUTTON_REPEAT:
344#endif
345 { 280 {
346 global_settings.volume--; 281 global_settings.volume--;
347 setvol(); 282 setvol();
@@ -357,59 +292,18 @@ long gui_wps_show(void)
357 } 292 }
358 } 293 }
359 break; 294 break;
360
361 /* fast forward / rewind */ 295 /* fast forward / rewind */
362#ifdef WPS_RC_FFWD 296 case ACTION_WPS_SEEKFWD:
363 case WPS_RC_FFWD: 297 case ACTION_WPS_SEEKBACK:
364#endif
365 case WPS_FFWD:
366 if (global_settings.party_mode)
367 break;
368
369#ifdef HAVE_DIR_NAVIGATION
370 if (current_tick - right_lastclick < HZ)
371 {
372 audio_next_dir();
373 right_lastclick = 0;
374 break;
375 }
376#endif
377
378#ifdef WPS_RC_REW
379 case WPS_RC_REW:
380#endif
381 case WPS_REW:
382 if (global_settings.party_mode) 298 if (global_settings.party_mode)
383 break; 299 break;
384
385#ifdef HAVE_DIR_NAVIGATION
386 if (current_tick - left_lastclick < HZ)
387 {
388 audio_prev_dir();
389 left_lastclick = 0;
390 break;
391 }
392#endif
393
394 ffwd_rew(button); 300 ffwd_rew(button);
395 break; 301 break;
396 302
397 /* prev / restart */ 303 /* prev / restart */
398 case WPS_PREV: 304 case ACTION_WPS_SKIPPREV:
399#ifdef WPS_PREV_PRE
400 if (lastbutton != WPS_PREV_PRE)
401 break;
402#endif
403#ifdef WPS_RC_PREV
404 case WPS_RC_PREV:
405 if (global_settings.party_mode) 305 if (global_settings.party_mode)
406 break; 306 break;
407#ifdef WPS_RC_PREV_PRE
408 if ((button == WPS_RC_PREV) && (lastbutton != WPS_RC_PREV_PRE))
409 break;
410#endif
411#endif
412 left_lastclick = current_tick;
413 update_track = true; 307 update_track = true;
414 308
415#ifdef AB_REPEAT_ENABLE 309#ifdef AB_REPEAT_ENABLE
@@ -450,61 +344,10 @@ long gui_wps_show(void)
450 } 344 }
451 break; 345 break;
452 346
453#ifdef WPS_NEXT_DIR
454#ifdef WPS_RC_NEXT_DIR
455 case WPS_RC_NEXT_DIR:
456#endif
457 case WPS_NEXT_DIR:
458 if (global_settings.party_mode)
459 break;
460#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
461 if (ab_repeat_mode_enabled())
462 {
463 ab_set_B_marker(wps_state.id3->elapsed);
464 ab_jump_to_A_marker();
465 update_track = true;
466 }
467 else
468#endif
469 {
470 audio_next_dir();
471 }
472 break;
473#endif
474#ifdef WPS_PREV_DIR
475#ifdef WPS_RC_PREV_DIR
476 case WPS_RC_PREV_DIR:
477#endif
478 case WPS_PREV_DIR:
479 if (global_settings.party_mode)
480 break;
481#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
482 if (ab_repeat_mode_enabled())
483 ab_set_A_marker(wps_state.id3->elapsed);
484 else
485#endif
486 {
487 audio_prev_dir();
488 }
489 break;
490#endif
491
492 /* next */ 347 /* next */
493 case WPS_NEXT: 348 case ACTION_WPS_SKIPNEXT:
494#ifdef WPS_NEXT_PRE
495 if (lastbutton != WPS_NEXT_PRE)
496 break;
497#endif
498#ifdef WPS_RC_NEXT
499 case WPS_RC_NEXT:
500 if (global_settings.party_mode) 349 if (global_settings.party_mode)
501 break; 350 break;
502#ifdef WPS_RC_NEXT_PRE
503 if ((button == WPS_RC_NEXT) && (lastbutton != WPS_RC_NEXT_PRE))
504 break;
505#endif
506#endif
507 right_lastclick = current_tick;
508 update_track = true; 351 update_track = true;
509 352
510#ifdef AB_REPEAT_ENABLE 353#ifdef AB_REPEAT_ENABLE
@@ -527,27 +370,44 @@ long gui_wps_show(void)
527 370
528 audio_next(); 371 audio_next();
529 break; 372 break;
530 373 /* next / prev directories */
531#ifdef WPS_MENU 374 case ACTION_WPS_NEXTDIR:
532 /* menu key functions */ 375 if (global_settings.party_mode)
533 case WPS_MENU:
534#ifdef WPS_MENU_PRE
535 if (lastbutton != WPS_MENU_PRE)
536 break; 376 break;
377#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
378 if (ab_repeat_mode_enabled())
379 {
380 ab_set_B_marker(wps_state.id3->elapsed);
381 ab_jump_to_A_marker();
382 update_track = true;
383 }
384 else
537#endif 385#endif
538#ifdef WPS_RC_MENU 386 {
539 case WPS_RC_MENU: 387 audio_next_dir();
540#ifdef WPS_RC_MENU_PRE 388 }
541 if ((button == WPS_RC_MENU) && (lastbutton != WPS_RC_MENU_PRE)) 389 break;
390 case ACTION_WPS_PREVDIR:
391 if (global_settings.party_mode)
542 break; 392 break;
393#if defined(AB_REPEAT_ENABLE) && defined(WPS_AB_SHARE_DIR_BUTTONS)
394 if (ab_repeat_mode_enabled())
395 ab_set_A_marker(wps_state.id3->elapsed);
396 else
543#endif 397#endif
544#endif 398 {
399 audio_prev_dir();
400 }
401 break;
402 /* menu key functions */
403 case ACTION_WPS_MENU:
545 FOR_NB_SCREENS(i) 404 FOR_NB_SCREENS(i)
546 gui_wps[i].display->stop_scroll(); 405 gui_wps[i].display->stop_scroll();
547 406
548#ifdef HAVE_LCD_COLOR 407#ifdef HAVE_LCD_COLOR
549 show_main_backdrop(); 408 show_main_backdrop();
550#endif 409#endif
410 action_signalscreenchange();
551 if (main_menu()) 411 if (main_menu())
552 return true; 412 return true;
553#ifdef HAVE_LCD_COLOR 413#ifdef HAVE_LCD_COLOR
@@ -561,25 +421,17 @@ long gui_wps_show(void)
561#endif 421#endif
562 restore = true; 422 restore = true;
563 break; 423 break;
564#endif /* WPS_MENU */
565 424
566#ifdef WPS_KEYLOCK
567 /* key lock */ 425 /* key lock */
568 case WPS_KEYLOCK: 426 case ACTION_STD_KEYLOCK:
569 case WPS_KEYLOCK | BUTTON_REPEAT: 427 action_setsoftwarekeylock(ACTION_STD_KEYLOCK,true);
570 keys_locked = !keys_locked; 428 display_keylock_text(true);
571 display_keylock_text(keys_locked);
572 restore = true; 429 restore = true;
573 waitfor_nokey();
574 break; 430 break;
575#endif 431
576 432
577#ifdef HAVE_QUICKSCREEN 433#ifdef HAVE_QUICKSCREEN
578 /* play settings */ 434 case ACTION_WPS_QUICKSCREEN:
579 case WPS_QUICK:
580#ifdef WPS_RC_QUICK
581 case WPS_RC_QUICK:
582#endif
583#ifdef HAVE_LCD_COLOR 435#ifdef HAVE_LCD_COLOR
584 show_main_backdrop(); 436 show_main_backdrop();
585#endif 437#endif
@@ -595,8 +447,8 @@ long gui_wps_show(void)
595 } 447 }
596#endif 448#endif
597 restore = true; 449 restore = true;
598 lastbutton = 0;
599 break; 450 break;
451#endif /* HAVE_QUICKSCREEN */
600 452
601 /* screen settings */ 453 /* screen settings */
602#ifdef BUTTON_F3 454#ifdef BUTTON_F3
@@ -611,17 +463,14 @@ long gui_wps_show(void)
611 { 463 {
612 gui_wps_set_margin(&gui_wps[i]); 464 gui_wps_set_margin(&gui_wps[i]);
613 } 465 }
614#endif 466#endif /* BUTTON_F3 */
615 restore = true; 467 restore = true;
616 lastbutton = 0;
617 break; 468 break;
618#endif 469#endif
619 470
620 /* pitch screen */ 471 /* pitch screen */
621#if CONFIG_KEYPAD == RECORDER_PAD || CONFIG_KEYPAD == IRIVER_H100_PAD \ 472#ifdef HAVE_PITCHSCREEN
622 || CONFIG_KEYPAD == IRIVER_H300_PAD 473 case ACTION_WPS_PITCHSCREEN:
623 case BUTTON_ON | BUTTON_UP:
624 case BUTTON_ON | BUTTON_DOWN:
625#ifdef HAVE_LCD_COLOR 474#ifdef HAVE_LCD_COLOR
626 show_main_backdrop(); 475 show_main_backdrop();
627#endif 476#endif
@@ -632,17 +481,10 @@ long gui_wps_show(void)
632#endif 481#endif
633 restore = true; 482 restore = true;
634 break; 483 break;
635#endif 484#endif /* HAVE_PITCHSCREEN */
636#endif
637 485
638#ifdef AB_REPEAT_ENABLE 486#ifdef AB_REPEAT_ENABLE
639 487 case ACTION_WPSAB_SINGLE:
640#ifdef WPS_AB_SINGLE
641 case WPS_AB_SINGLE:
642#ifdef WPS_AB_SINGLE_PRE
643 if (lastbutton != WPS_AB_SINGLE_PRE)
644 break;
645#endif
646/* If we are using the menu option to enable ab_repeat mode, don't do anything 488/* If we are using the menu option to enable ab_repeat mode, don't do anything
647 * when it's disabled */ 489 * when it's disabled */
648#if (AB_REPEAT_ENABLE == 1) 490#if (AB_REPEAT_ENABLE == 1)
@@ -661,20 +503,15 @@ long gui_wps_show(void)
661 } 503 }
662 ab_set_A_marker(wps_state.id3->elapsed); 504 ab_set_A_marker(wps_state.id3->elapsed);
663 break; 505 break;
664#endif
665 506
666 507
667#ifdef WPS_AB_SET_A_MARKER
668 /* set A marker for A-B repeat */ 508 /* set A marker for A-B repeat */
669 case WPS_AB_SET_A_MARKER: 509 case ACTION_WPSAB_SETA:
670 if (ab_repeat_mode_enabled()) 510 if (ab_repeat_mode_enabled())
671 ab_set_A_marker(wps_state.id3->elapsed); 511 ab_set_A_marker(wps_state.id3->elapsed);
672 break; 512 break;
673#endif
674
675#ifdef WPS_AB_SET_B_MARKER
676 /* set B marker for A-B repeat and jump to A */ 513 /* set B marker for A-B repeat and jump to A */
677 case WPS_AB_SET_B_MARKER: 514 case ACTION_WPSAB_SETB:
678 if (ab_repeat_mode_enabled()) 515 if (ab_repeat_mode_enabled())
679 { 516 {
680 ab_set_B_marker(wps_state.id3->elapsed); 517 ab_set_B_marker(wps_state.id3->elapsed);
@@ -682,46 +519,24 @@ long gui_wps_show(void)
682 update_track = true; 519 update_track = true;
683 } 520 }
684 break; 521 break;
685#endif
686
687#ifdef WPS_AB_RESET_AB_MARKERS
688 /* reset A&B markers */ 522 /* reset A&B markers */
689 case WPS_AB_RESET_AB_MARKERS: 523 case ACTION_WPSAB_RESET:
690 if (ab_repeat_mode_enabled()) 524 if (ab_repeat_mode_enabled())
691 { 525 {
692 ab_reset_markers(); 526 ab_reset_markers();
693 update_track = true; 527 update_track = true;
694 } 528 }
695 break; 529 break;
696#endif
697
698#endif /* AB_REPEAT_ENABLE */ 530#endif /* AB_REPEAT_ENABLE */
699 531
700 /* stop and exit wps */ 532 /* stop and exit wps */
701#ifdef WPS_EXIT 533 case ACTION_WPS_STOP:
702 case WPS_EXIT:
703# ifdef WPS_EXIT_PRE
704 if ((lastbutton & ~BUTTON_REPEAT) != WPS_EXIT_PRE)
705 break;
706# endif
707 if (global_settings.party_mode)
708 break;
709 exit = true;
710#ifdef WPS_RC_EXIT
711 case WPS_RC_EXIT:
712#ifdef WPS_RC_EXIT_PRE
713 if ((lastbutton & ~BUTTON_REPEAT) != WPS_RC_EXIT_PRE)
714 break;
715#endif
716 if (global_settings.party_mode) 534 if (global_settings.party_mode)
717 break; 535 break;
718 exit = true; 536 exit = true;
719#endif
720 break; 537 break;
721#endif
722 538
723#ifdef WPS_ID3 539 case ACTION_WPS_ID3SCREEN:
724 case WPS_ID3:
725#ifdef HAVE_LCD_COLOR 540#ifdef HAVE_LCD_COLOR
726 show_main_backdrop(); 541 show_main_backdrop();
727#endif 542#endif
@@ -737,10 +552,10 @@ long gui_wps_show(void)
737#endif 552#endif
738 restore = true; 553 restore = true;
739 break; 554 break;
740#endif
741 555
742 case BUTTON_NONE: /* Timeout */ 556 case ACTION_NONE: /* Timeout */
743 update_track = true; 557 update_track = true;
558 ffwd_rew(button); /* hopefully fix the ffw/rwd bug */
744 break; 559 break;
745 560
746 case SYS_POWEROFF: 561 case SYS_POWEROFF:
@@ -779,6 +594,7 @@ long gui_wps_show(void)
779 } 594 }
780 595
781 if (exit) { 596 if (exit) {
597 action_signalscreenchange();
782#ifdef HAVE_LCD_CHARCELLS 598#ifdef HAVE_LCD_CHARCELLS
783 status_set_record(false); 599 status_set_record(false);
784 status_set_audio(false); 600 status_set_audio(false);
@@ -830,8 +646,6 @@ long gui_wps_show(void)
830 gui_wps_refresh(&gui_wps[i], 0, WPS_REFRESH_NON_STATIC); 646 gui_wps_refresh(&gui_wps[i], 0, WPS_REFRESH_NON_STATIC);
831 } 647 }
832 } 648 }
833 if (button != BUTTON_NONE)
834 lastbutton = button;
835 } 649 }
836 return 0; /* unreachable - just to reduce compiler warnings */ 650 return 0; /* unreachable - just to reduce compiler warnings */
837} 651}
diff --git a/apps/gui/list.c b/apps/gui/list.c
index b17e01ed90..f48d4d9ee1 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -26,6 +26,7 @@
26#include "settings.h" 26#include "settings.h"
27#include "kernel.h" 27#include "kernel.h"
28 28
29#include "action.h"
29#include "screen_access.h" 30#include "screen_access.h"
30#include "list.h" 31#include "list.h"
31#include "scrollbar.h" 32#include "scrollbar.h"
@@ -683,106 +684,65 @@ unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button)
683 gui_synclist_limit_scroll(lists, true); 684 gui_synclist_limit_scroll(lists, true);
684 switch(button) 685 switch(button)
685 { 686 {
686 case LIST_PREV: 687 case ACTION_STD_PREV:
687#ifdef LIST_RC_PREV
688 case LIST_RC_PREV:
689#endif
690 gui_synclist_limit_scroll(lists, false); 688 gui_synclist_limit_scroll(lists, false);
691 689
692 case LIST_PREV | BUTTON_REPEAT: 690 case ACTION_STD_PREVREPEAT:
693#ifdef LIST_RC_PREV
694 case LIST_RC_PREV | BUTTON_REPEAT:
695#endif
696 gui_synclist_select_previous(lists); 691 gui_synclist_select_previous(lists);
697 gui_synclist_draw(lists); 692 gui_synclist_draw(lists);
698 yield(); 693 yield();
699 return LIST_PREV; 694 return ACTION_STD_PREV;
700 695
701 case LIST_NEXT: 696 case ACTION_STD_NEXT:
702#ifdef LIST_RC_NEXT
703 case LIST_RC_NEXT:
704#endif
705 gui_synclist_limit_scroll(lists, false); 697 gui_synclist_limit_scroll(lists, false);
706 698
707 case LIST_NEXT | BUTTON_REPEAT: 699 case ACTION_STD_NEXTREPEAT:
708#ifdef LIST_RC_NEXT
709
710 case LIST_RC_NEXT | BUTTON_REPEAT:
711#endif
712 gui_synclist_select_next(lists); 700 gui_synclist_select_next(lists);
713 gui_synclist_draw(lists); 701 gui_synclist_draw(lists);
714 yield(); 702 yield();
715 return LIST_NEXT; 703 return ACTION_STD_NEXT;
716 704
717#ifdef LIST_PGRIGHT 705#ifdef HAVE_LCD_BITMAP
718 case LIST_PGRIGHT: 706 case ACTION_TREE_PGRIGHT:
719#if !(LIST_PGRIGHT & BUTTON_REPEAT)
720 case LIST_PGRIGHT | BUTTON_REPEAT:
721#endif
722#ifdef LIST_RC_PGRIGHT
723 case LIST_RC_PGRIGHT:
724 case LIST_RC_PGRIGHT | BUTTON_REPEAT:
725#endif
726 gui_synclist_scroll_right(lists); 707 gui_synclist_scroll_right(lists);
727 gui_synclist_draw(lists); 708 gui_synclist_draw(lists);
728 return LIST_PGRIGHT; 709 return ACTION_TREE_PGRIGHT;
729#endif 710 case ACTION_TREE_PGLEFT:
730
731#ifdef LIST_PGLEFT
732 case LIST_PGLEFT:
733#if !(LIST_PGLEFT & BUTTON_REPEAT)
734 case LIST_PGLEFT | BUTTON_REPEAT:
735#endif
736#ifdef LIST_RC_PGLEFT
737 case LIST_RC_PGLEFT:
738 case LIST_RC_PGLEFT | BUTTON_REPEAT:
739#endif
740 gui_synclist_scroll_left(lists); 711 gui_synclist_scroll_left(lists);
741 gui_synclist_draw(lists); 712 gui_synclist_draw(lists);
742 return LIST_PGLEFT; 713 return ACTION_TREE_PGLEFT;
743#endif 714#endif
744 715
745/* for pgup / pgdown, we are obliged to have a different behaviour depending on the screen 716/* for pgup / pgdown, we are obliged to have a different behaviour depending on the screen
746 * for which the user pressed the key since for example, remote and main screen doesn't 717 * for which the user pressed the key since for example, remote and main screen doesn't
747 * have the same number of lines*/ 718 * have the same number of lines*/
748#ifdef LIST_PGUP 719 case ACTION_LISTTREE_PGUP:
749 case LIST_PGUP:
750 gui_synclist_limit_scroll(lists, false); 720 gui_synclist_limit_scroll(lists, false);
751 case LIST_PGUP | BUTTON_REPEAT:
752 gui_synclist_select_previous_page(lists, SCREEN_MAIN); 721 gui_synclist_select_previous_page(lists, SCREEN_MAIN);
753 gui_synclist_draw(lists); 722 gui_synclist_draw(lists);
754 yield(); 723 yield();
755 return LIST_NEXT; 724 return ACTION_STD_NEXT;
756#endif 725
757 726 case ACTION_LISTTREE_PGDOWN:
758#ifdef LIST_RC_PGUP
759 case LIST_RC_PGUP:
760 gui_synclist_limit_scroll(lists, false); 727 gui_synclist_limit_scroll(lists, false);
761 case LIST_RC_PGUP | BUTTON_REPEAT: 728 gui_synclist_select_next_page(lists, SCREEN_MAIN);
762 gui_synclist_select_previous_page(lists, SCREEN_REMOTE);
763 gui_synclist_draw(lists); 729 gui_synclist_draw(lists);
764 yield(); 730 yield();
765 return LIST_NEXT; 731 return ACTION_STD_PREV;
766#endif 732#if (REMOTE_BUTTON != 0 )
767 733 case ACTION_LISTTREE_RC_PGUP:
768#ifdef LIST_PGDN
769 case LIST_PGDN:
770 gui_synclist_limit_scroll(lists, false); 734 gui_synclist_limit_scroll(lists, false);
771 case LIST_PGDN | BUTTON_REPEAT: 735 gui_synclist_select_previous_page(lists, SCREEN_REMOTE);
772 gui_synclist_select_next_page(lists, SCREEN_MAIN);
773 gui_synclist_draw(lists); 736 gui_synclist_draw(lists);
774 yield(); 737 yield();
775 return LIST_PREV; 738 return ACTION_STD_NEXT;
776#endif 739
777 740 case ACTION_LISTTREE_RC_PGDOWN:
778#ifdef LIST_RC_PGDN
779 case LIST_RC_PGDN:
780 gui_synclist_limit_scroll(lists, false); 741 gui_synclist_limit_scroll(lists, false);
781 case LIST_RC_PGDN | BUTTON_REPEAT:
782 gui_synclist_select_next_page(lists, SCREEN_REMOTE); 742 gui_synclist_select_next_page(lists, SCREEN_REMOTE);
783 gui_synclist_draw(lists); 743 gui_synclist_draw(lists);
784 yield(); 744 yield();
785 return LIST_PREV; 745 return ACTION_STD_PREV;
786#endif 746#endif
787 } 747 }
788 return 0; 748 return 0;
diff --git a/apps/gui/list.h b/apps/gui/list.h
index 8d3ac9ad4c..2a80298379 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -26,89 +26,6 @@
26 26
27#define SCROLLBAR_WIDTH 6 27#define SCROLLBAR_WIDTH 6
28 28
29/* Key assignement */
30#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
31 (CONFIG_KEYPAD == IRIVER_H300_PAD)
32#define LIST_NEXT BUTTON_DOWN
33#define LIST_PREV BUTTON_UP
34#define LIST_PGUP (BUTTON_ON | BUTTON_UP)
35#define LIST_PGDN (BUTTON_ON | BUTTON_DOWN)
36#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
37#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
38
39#ifdef CONFIG_REMOTE_KEYPAD
40#define LIST_RC_NEXT BUTTON_RC_FF
41#define LIST_RC_PREV BUTTON_RC_REW
42#define LIST_RC_PGUP BUTTON_RC_SOURCE
43#define LIST_RC_PGDN BUTTON_RC_BITRATE
44#define LIST_RC_PGRIGHT (BUTTON_RC_VOL_UP)
45#define LIST_RC_PGLEFT (BUTTON_RC_VOL_DOWN)
46#endif /* CONFIG_REMOTE_KEYPAD */
47
48#elif CONFIG_KEYPAD == RECORDER_PAD
49#define LIST_NEXT BUTTON_DOWN
50#define LIST_PREV BUTTON_UP
51#define LIST_PGUP (BUTTON_ON | BUTTON_UP)
52#define LIST_PGDN (BUTTON_ON | BUTTON_DOWN)
53#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
54#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
55
56#define LIST_RC_NEXT BUTTON_RC_RIGHT
57#define LIST_RC_PREV BUTTON_RC_LEFT
58
59#elif CONFIG_KEYPAD == PLAYER_PAD
60#define LIST_NEXT BUTTON_RIGHT
61#define LIST_PREV BUTTON_LEFT
62
63#define LIST_RC_NEXT BUTTON_RC_RIGHT
64#define LIST_RC_PREV BUTTON_RC_LEFT
65
66#elif CONFIG_KEYPAD == ONDIO_PAD
67#define LIST_NEXT BUTTON_DOWN
68#define LIST_PREV BUTTON_UP
69#define LIST_PGRIGHT (BUTTON_MENU | BUTTON_RIGHT)
70#define LIST_PGLEFT (BUTTON_MENU | BUTTON_LEFT)
71
72#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
73#define LIST_NEXT BUTTON_SCROLL_FWD
74#define LIST_PREV BUTTON_SCROLL_BACK
75#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
76#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
77
78#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
79#define LIST_NEXT BUTTON_DOWN
80#define LIST_PREV BUTTON_UP
81//#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_)
82//#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_) Todo: define those
83
84#elif CONFIG_KEYPAD == GMINI100_PAD
85#define LIST_NEXT BUTTON_DOWN
86#define LIST_PREV BUTTON_UP
87#define LIST_PGUP (BUTTON_ON | BUTTON_UP)
88#define LIST_PGDN (BUTTON_ON | BUTTON_DOWN)
89#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
90#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
91
92#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
93#define LIST_NEXT BUTTON_DOWN
94#define LIST_PREV BUTTON_UP
95#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
96#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
97
98#elif CONFIG_KEYPAD == GIGABEAT_PAD
99#define LIST_NEXT BUTTON_DOWN
100#define LIST_PREV BUTTON_UP
101#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
102#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
103
104#elif CONFIG_KEYPAD == IRIVER_H10_PAD
105#define LIST_NEXT BUTTON_SCROLL_DOWN
106#define LIST_PREV BUTTON_SCROLL_UP
107#define LIST_PGRIGHT (BUTTON_RIGHT | BUTTON_REPEAT)
108#define LIST_PGLEFT (BUTTON_LEFT | BUTTON_REPEAT)
109
110#endif
111
112/* 29/*
113 * The gui_list is based on callback functions, if you want the list 30 * The gui_list is based on callback functions, if you want the list
114 * to display something you have to provide it a function that 31 * to display something you have to provide it a function that
@@ -390,8 +307,8 @@ void gui_synclist_scroll_left(struct gui_synclist * lists);
390 * - lists : the synchronized lists 307 * - lists : the synchronized lists
391 * - button : the keycode of a pressed button 308 * - button : the keycode of a pressed button
392 * returned value : 309 * returned value :
393 * - LIST_NEXT when moving forward (next item or pgup) 310 * - ACTION_STD_NEXT when moving forward (next item or pgup)
394 * - LIST_PREV when moving backward (previous item or pgdown) 311 * - ACTION_STD_PREV when moving backward (previous item or pgdown)
395 */ 312 */
396extern unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button); 313extern unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button);
397 314
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index e998ee61ad..9465a2e5af 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -29,6 +29,7 @@
29#include "kernel.h" 29#include "kernel.h"
30#include "misc.h" 30#include "misc.h"
31#include "statusbar.h" 31#include "statusbar.h"
32#include "action.h"
32 33
33void gui_quickscreen_init(struct gui_quickscreen * qs, 34void gui_quickscreen_init(struct gui_quickscreen * qs,
34 struct option_select *left_option, 35 struct option_select *left_option,
@@ -128,59 +129,28 @@ bool gui_quickscreen_do_button(struct gui_quickscreen * qs, int button)
128 129
129 switch(button) 130 switch(button)
130 { 131 {
131 case QUICKSCREEN_LEFT : 132 case ACTION_QS_LEFT:
132 case QUICKSCREEN_LEFT | BUTTON_REPEAT :
133#ifdef QUICKSCREEN_RC_LEFT
134 case QUICKSCREEN_RC_LEFT :
135 case QUICKSCREEN_RC_LEFT | BUTTON_REPEAT :
136#endif
137 option_select_next(qs->left_option); 133 option_select_next(qs->left_option);
138 return(true); 134 return(true);
139 135
140 case QUICKSCREEN_BOTTOM : 136 case ACTION_QS_DOWN:
141 case QUICKSCREEN_BOTTOM | BUTTON_REPEAT :
142#ifdef QUICKSCREEN_RC_BOTTOM
143 case QUICKSCREEN_RC_BOTTOM :
144 case QUICKSCREEN_RC_BOTTOM | BUTTON_REPEAT :
145#endif
146 option_select_next(qs->bottom_option); 137 option_select_next(qs->bottom_option);
147 return(true); 138 return(true);
148 139
149 case QUICKSCREEN_RIGHT : 140 case ACTION_QS_RIGHT:
150 case QUICKSCREEN_RIGHT | BUTTON_REPEAT :
151#ifdef QUICKSCREEN_RC_RIGHT
152 case QUICKSCREEN_RC_RIGHT :
153 case QUICKSCREEN_RC_RIGHT | BUTTON_REPEAT :
154#endif
155 option_select_next(qs->right_option); 141 option_select_next(qs->right_option);
156 return(true); 142 return(true);
157 143
158#ifdef QUICKSCREEN_BOTTOM_INV 144 case ACTION_QS_DOWNINV:
159 case QUICKSCREEN_BOTTOM_INV :
160 case QUICKSCREEN_BOTTOM_INV | BUTTON_REPEAT :
161#endif
162#ifdef QUICKSCREEN_RC_BOTTOM_INV
163 case QUICKSCREEN_RC_BOTTOM_INV :
164 case QUICKSCREEN_RC_BOTTOM_INV | BUTTON_REPEAT :
165#endif
166#if defined(QUICKSCREEN_RC_BOTTOM_INV) || defined(QUICKSCREEN_BOTTOM_INV)
167 option_select_prev(qs->bottom_option); 145 option_select_prev(qs->bottom_option);
168 return(true); 146 return(true);
169#endif
170 } 147 }
171 return(false); 148 return(false);
172} 149}
173#ifdef BUTTON_REMOTE
174#define uncombine_button(key_read, combined_button) \
175 key_read & ~(combined_button & ~BUTTON_REMOTE)
176#else
177#define uncombine_button(key_read, combined_button) \
178 key_read & ~combined_button
179#endif
180 150
181bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter) 151bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
182{ 152{
183 int raw_key, button; 153 int button;
184 /* To quit we need either : 154 /* To quit we need either :
185 * - a second press on the button that made us enter 155 * - a second press on the button that made us enter
186 * - an action taken while pressing the enter button, 156 * - an action taken while pressing the enter button,
@@ -188,9 +158,9 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
188 bool can_quit=false; 158 bool can_quit=false;
189 gui_syncquickscreen_draw(qs); 159 gui_syncquickscreen_draw(qs);
190 gui_syncstatusbar_draw(&statusbars, true); 160 gui_syncstatusbar_draw(&statusbars, true);
161 action_signalscreenchange();
191 while (true) { 162 while (true) {
192 raw_key = button_get(true); 163 button = get_action(CONTEXT_QUICKSCREEN,TIMEOUT_BLOCK);
193 button=uncombine_button(raw_key, button_enter);
194 if(default_event_handler(button) == SYS_USB_CONNECTED) 164 if(default_event_handler(button) == SYS_USB_CONNECTED)
195 return(true); 165 return(true);
196 if(gui_quickscreen_do_button(qs, button)) 166 if(gui_quickscreen_do_button(qs, button))
@@ -200,23 +170,19 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
200 qs->callback(qs); 170 qs->callback(qs);
201 gui_syncquickscreen_draw(qs); 171 gui_syncquickscreen_draw(qs);
202 } 172 }
203 else if(raw_key==button_enter) 173 else if(button==button_enter)
204 can_quit=true; 174 can_quit=true;
205 if(raw_key==(button_enter | BUTTON_REL) && can_quit) 175
206 return(false); 176 if((button == button_enter) && can_quit)
207#ifdef QUICKSCREEN_QUIT 177 break;
208 if(raw_key==QUICKSCREEN_QUIT 178
209#ifdef QUICKSCREEN_QUIT2 179 if(button==ACTION_STD_CANCEL)
210 || raw_key==QUICKSCREEN_QUIT2 180 break;
211#endif 181
212#if QUICKSCREEN_RC_QUIT
213 || raw_key==QUICKSCREEN_RC_QUIT
214#endif
215 )
216 return(false);
217#endif /* QUICKSCREEN_QUIT */
218 gui_syncstatusbar_draw(&statusbars, false); 182 gui_syncstatusbar_draw(&statusbars, false);
219 } 183 }
184 action_signalscreenchange();
185 return false;
220} 186}
221 187
222#endif /* HAVE_QUICKSCREEN */ 188#endif /* HAVE_QUICKSCREEN */
diff --git a/apps/gui/quickscreen.h b/apps/gui/quickscreen.h
index 63214f3c22..ebc7cef61a 100644
--- a/apps/gui/quickscreen.h
+++ b/apps/gui/quickscreen.h
@@ -27,42 +27,6 @@
27#include "option_select.h" 27#include "option_select.h"
28#include "screen_access.h" 28#include "screen_access.h"
29 29
30#define QUICKSCREEN_LEFT BUTTON_LEFT
31#define QUICKSCREEN_RIGHT BUTTON_RIGHT
32
33#if (CONFIG_KEYPAD == RECORDER_PAD)
34#define QUICKSCREEN_BOTTOM BUTTON_DOWN
35#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
36#define QUICKSCREEN_QUIT BUTTON_F3
37#define QUICKSCREEN_QUIT2 BUTTON_OFF
38#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
39#define QUICKSCREEN_BOTTOM BUTTON_DOWN
40#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
41#define QUICKSCREEN_QUIT BUTTON_MODE
42#define QUICKSCREEN_QUIT2 BUTTON_OFF
43#define QUICKSCREEN_RC_QUIT BUTTON_RC_MODE
44#ifdef CONFIG_REMOTE_KEYPAD
45#define QUICKSCREEN_RC_LEFT BUTTON_RC_REW
46#define QUICKSCREEN_RC_BOTTOM BUTTON_RC_VOL_DOWN
47#define QUICKSCREEN_RC_BOTTOM_INV BUTTON_RC_VOL_UP
48#define QUICKSCREEN_RC_RIGHT BUTTON_RC_FF
49#endif
50#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
51#define QUICKSCREEN_BOTTOM BUTTON_PLAY
52#define QUICKSCREEN_QUIT BUTTON_MENU
53#define QUICKSCREEN_QUIT2 BUTTON_SELECT
54#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
55#define QUICKSCREEN_BOTTOM BUTTON_DOWN
56#define QUICKSCREEN_BOTTOM_INV BUTTON_UP
57#define QUICKSCREEN_QUIT BUTTON_REC
58#define QUICKSCREEN_QUIT2 BUTTON_POWER
59#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
60#define QUICKSCREEN_BOTTOM BUTTON_SCROLL_DOWN
61#define QUICKSCREEN_BOTTOM_INV BUTTON_SCROLL_UP
62#define QUICKSCREEN_QUIT BUTTON_REW
63#define QUICKSCREEN_QUIT2 BUTTON_POWER
64#endif
65
66struct gui_quickscreen; 30struct gui_quickscreen;
67/* 31/*
68 * Callback function called each time the quickscreen gets modified 32 * Callback function called each time the quickscreen gets modified
diff --git a/apps/gui/select.c b/apps/gui/select.c
index 89a047890c..12a93fcbcd 100644
--- a/apps/gui/select.c
+++ b/apps/gui/select.c
@@ -23,6 +23,7 @@
23#include "textarea.h" 23#include "textarea.h"
24#include "screen_access.h" 24#include "screen_access.h"
25#include "kernel.h" 25#include "kernel.h"
26#include "action.h"
26 27
27 28
28void gui_select_init_numeric(struct gui_select * select, 29void gui_select_init_numeric(struct gui_select * select,
@@ -79,56 +80,28 @@ bool gui_syncselect_do_button(struct gui_select * select, int button)
79{ 80{
80 switch(button) 81 switch(button)
81 { 82 {
82 case SELECT_INC | BUTTON_REPEAT : 83 case ACTION_SETTINGS_INCREPEAT:
83#ifdef SELECT_RC_INC
84 case SELECT_RC_INC | BUTTON_REPEAT :
85#endif
86 select->options.limit_loop = true; 84 select->options.limit_loop = true;
87 case SELECT_INC : 85 case ACTION_SETTINGS_INC:
88#ifdef SELECT_RC_INC
89 case SELECT_RC_INC :
90#endif
91 option_select_next(&select->options); 86 option_select_next(&select->options);
92 return(true); 87 return(true);
93 88
94 case SELECT_DEC | BUTTON_REPEAT : 89 case ACTION_SETTINGS_DECREPEAT:
95#ifdef SELECT_RC_DEC
96 case SELECT_RC_DEC | BUTTON_REPEAT :
97#endif
98 select->options.limit_loop = true; 90 select->options.limit_loop = true;
99 case SELECT_DEC : 91 case ACTION_SETTINGS_DEC:
100#ifdef SELECT_RC_DEC
101 case SELECT_RC_DEC :
102#endif
103 option_select_prev(&select->options); 92 option_select_prev(&select->options);
104 return(true); 93 return(true);
105 94
106 case SELECT_OK : 95 case ACTION_STD_OK:
107#ifdef SELECT_RC_OK 96 case ACTION_STD_PREV: /*NOTE: this is in CONTEXT_SETTINGS ! */
108 case SELECT_RC_OK :
109#endif
110#ifdef SELECT_RC_OK2
111 case SELECT_RC_OK2 :
112#endif
113#ifdef SELECT_OK2
114 case SELECT_OK2 :
115#endif
116 select->validated=true; 97 select->validated=true;
117 return(false); 98 return(false);
118 99
119 case SELECT_CANCEL : 100 case ACTION_STD_CANCEL:
120#ifdef SELECT_CANCEL2
121 case SELECT_CANCEL2 :
122#endif
123#ifdef SELECT_RC_CANCEL
124 case SELECT_RC_CANCEL :
125#endif
126#ifdef SELECT_RC_CANCEL2
127 case SELECT_RC_CANCEL2 :
128#endif
129 select->canceled = true; 101 select->canceled = true;
130 gui_syncselect_draw(select); 102 gui_syncselect_draw(select);
131 sleep(HZ/2); 103 sleep(HZ/2);
104 action_signalscreenchange();
132 return(false); 105 return(false);
133 } 106 }
134 return(false); 107 return(false);
diff --git a/apps/gui/select.h b/apps/gui/select.h
index 9270214d61..2556a683c8 100644
--- a/apps/gui/select.h
+++ b/apps/gui/select.h
@@ -23,104 +23,6 @@
23#include "settings.h" 23#include "settings.h"
24#include "option_select.h" 24#include "option_select.h"
25 25
26#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
27 (CONFIG_KEYPAD == IRIVER_H300_PAD)
28#define SELECT_INC BUTTON_UP
29#define SELECT_DEC BUTTON_DOWN
30#define SELECT_OK BUTTON_SELECT
31#define SELECT_OK2 BUTTON_LEFT
32#define SELECT_CANCEL BUTTON_OFF
33#define SELECT_CANCEL2 BUTTON_MODE
34
35#define SELECT_RC_INC BUTTON_RC_FF
36#define SELECT_RC_DEC BUTTON_RC_REW
37#define SELECT_RC_OK BUTTON_RC_ON
38#define SELECT_RC_OK2 BUTTON_RC_MENU
39#define SELECT_RC_CANCEL BUTTON_RC_STOP
40#define SELECT_RC_CANCEL2 BUTTON_RC_MODE
41
42#elif CONFIG_KEYPAD == RECORDER_PAD
43#define SELECT_INC BUTTON_UP
44#define SELECT_DEC BUTTON_DOWN
45#define SELECT_OK BUTTON_PLAY
46#define SELECT_OK2 BUTTON_LEFT
47#define SELECT_CANCEL BUTTON_OFF
48#define SELECT_CANCEL2 BUTTON_F1
49
50#define SELECT_RC_INC BUTTON_RC_RIGHT
51#define SELECT_RC_DEC BUTTON_RC_LEFT
52#define SELECT_RC_OK BUTTON_RC_PLAY
53#define SELECT_RC_CANCEL BUTTON_RC_STOP
54
55#elif CONFIG_KEYPAD == PLAYER_PAD
56#define SELECT_INC BUTTON_RIGHT
57#define SELECT_DEC BUTTON_LEFT
58#define SELECT_OK BUTTON_PLAY
59#define SELECT_CANCEL BUTTON_STOP
60#define SELECT_CANCEL2 BUTTON_MENU
61
62#define SELECT_RC_INC BUTTON_RC_RIGHT
63#define SELECT_RC_DEC BUTTON_RC_LEFT
64#define SELECT_RC_OK BUTTON_RC_PLAY
65#define SELECT_RC_CANCEL BUTTON_RC_STOP
66
67#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
68#define SELECT_INC BUTTON_SCROLL_FWD
69#define SELECT_DEC BUTTON_SCROLL_BACK
70#define SELECT_OK BUTTON_SELECT
71#define SELECT_OK2 BUTTON_LEFT
72#define SELECT_CANCEL BUTTON_MENU
73
74#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
75#define SELECT_INC BUTTON_UP
76#define SELECT_DEC BUTTON_DOWN
77#define SELECT_OK BUTTON_RIGHT
78#define SELECT_OK2 BUTTON_LEFT
79#define SELECT_CANCEL BUTTON_PLAY
80#define SELECT_CANCEL2 BUTTON_MODE
81
82#elif CONFIG_KEYPAD == ONDIO_PAD
83#define SELECT_INC BUTTON_UP
84#define SELECT_DEC BUTTON_DOWN
85#define SELECT_OK BUTTON_RIGHT
86#define SELECT_OK2 BUTTON_LEFT
87#define SELECT_CANCEL BUTTON_MENU
88#define SELECT_CANCEL2 BUTTON_OFF
89
90#elif CONFIG_KEYPAD == GMINI100_PAD
91#define SELECT_INC BUTTON_UP
92#define SELECT_DEC BUTTON_DOWN
93#define SELECT_OK BUTTON_PLAY
94#define SELECT_OK2 BUTTON_LEFT
95#define SELECT_CANCEL BUTTON_OFF
96#define SELECT_CANCEL2 BUTTON_MENU
97
98#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
99#define SELECT_INC BUTTON_UP
100#define SELECT_DEC BUTTON_DOWN
101#define SELECT_OK BUTTON_SELECT
102#define SELECT_OK2 BUTTON_LEFT
103#define SELECT_CANCEL BUTTON_PLAY
104#define SELECT_CANCEL2 BUTTON_POWER
105
106#elif CONFIG_KEYPAD == GIGABEAT_PAD
107#define SELECT_INC BUTTON_UP
108#define SELECT_DEC BUTTON_DOWN
109#define SELECT_OK BUTTON_MENU
110#define SELECT_OK2 BUTTON_LEFT
111#define SELECT_CANCEL BUTTON_A
112#define SELECT_CANCEL2 BUTTON_POWER
113
114#elif CONFIG_KEYPAD == IRIVER_H10_PAD
115#define SELECT_INC BUTTON_SCROLL_UP
116#define SELECT_DEC BUTTON_SCROLL_DOWN
117#define SELECT_OK BUTTON_PLAY
118#define SELECT_OK2 BUTTON_RIGHT
119#define SELECT_CANCEL BUTTON_POWER
120#define SELECT_CANCEL2 BUTTON_LEFT
121
122#endif
123
124struct gui_select 26struct gui_select
125{ 27{
126 bool canceled; 28 bool canceled;
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c
index 225f6d3f43..d567cf9ed4 100644
--- a/apps/gui/yesno.c
+++ b/apps/gui/yesno.c
@@ -3,6 +3,7 @@
3#include "kernel.h" 3#include "kernel.h"
4#include "misc.h" 4#include "misc.h"
5#include "lang.h" 5#include "lang.h"
6#include "action.h"
6 7
7void gui_yesno_init(struct gui_yesno * yn, 8void gui_yesno_init(struct gui_yesno * yn,
8 struct text_message * main_message, 9 struct text_message * main_message,
@@ -54,7 +55,7 @@ bool gui_yesno_draw_result(struct gui_yesno * yn, enum yesno_res result)
54 gui_textarea_put_message(yn->display, message, 0); 55 gui_textarea_put_message(yn->display, message, 0);
55 return(true); 56 return(true);
56} 57}
57 58#include "debug.h"
58enum yesno_res gui_syncyesno_run(struct text_message * main_message, 59enum yesno_res gui_syncyesno_run(struct text_message * main_message,
59 struct text_message * yes_message, 60 struct text_message * yes_message,
60 struct text_message * no_message) 61 struct text_message * no_message)
@@ -72,23 +73,21 @@ enum yesno_res gui_syncyesno_run(struct text_message * main_message,
72 } 73 }
73 while (result==-1) 74 while (result==-1)
74 { 75 {
75 button = button_get(true); 76 button = get_action(CONTEXT_YESNOSCREEN,TIMEOUT_BLOCK);
77 DEBUGF("button=%x\n",button);
76 switch (button) 78 switch (button)
77 { 79 {
78 case YESNO_OK: 80 case ACTION_YESNO_ACCEPT:
79#ifdef YESNO_RC_OK
80 case YESNO_RC_OK:
81#endif
82 result=YESNO_YES; 81 result=YESNO_YES;
83 break; 82 break;
84 83
85 default: 84 default:
86 if(default_event_handler(button) == SYS_USB_CONNECTED) 85 if(default_event_handler(button) == SYS_USB_CONNECTED)
87 return(YESNO_USB); 86 return(YESNO_USB);
88 if(!(button & BUTTON_REL)) 87 result = YESNO_NO;
89 result=YESNO_NO;
90 } 88 }
91 } 89 }
90 action_signalscreenchange();
92 FOR_NB_SCREENS(i) 91 FOR_NB_SCREENS(i)
93 result_displayed=gui_yesno_draw_result(&(yn[i]), result); 92 result_displayed=gui_yesno_draw_result(&(yn[i]), result);
94 if(result_displayed) 93 if(result_displayed)
diff --git a/apps/gui/yesno.h b/apps/gui/yesno.h
index 71658a5217..7b60cab132 100644
--- a/apps/gui/yesno.h
+++ b/apps/gui/yesno.h
@@ -4,41 +4,6 @@
4#include "screen_access.h" 4#include "screen_access.h"
5#include "textarea.h" 5#include "textarea.h"
6 6
7#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
8 (CONFIG_KEYPAD == IRIVER_H300_PAD)
9#define YESNO_OK BUTTON_SELECT
10#define YESNO_RC_OK BUTTON_RC_MENU
11
12#elif CONFIG_KEYPAD == RECORDER_PAD
13#define YESNO_OK BUTTON_PLAY
14#define YESNO_RC_OK BUTTON_RC_PLAY
15
16#elif CONFIG_KEYPAD == PLAYER_PAD
17#define YESNO_OK BUTTON_PLAY
18#define YESNO_RC_OK BUTTON_RC_PLAY
19
20#elif CONFIG_KEYPAD == ONDIO_PAD
21#define YESNO_OK BUTTON_RIGHT
22
23#elif CONFIG_KEYPAD == GMINI100_PAD
24#define YESNO_OK BUTTON_PLAY
25
26#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
27#define YESNO_OK BUTTON_PLAY
28
29#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
30#define YESNO_OK BUTTON_RIGHT
31
32#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
33#define YESNO_OK BUTTON_RIGHT
34
35#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
36#define YESNO_OK BUTTON_RIGHT
37
38#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
39#define YESNO_OK BUTTON_RIGHT
40
41#endif
42enum yesno_res 7enum yesno_res
43{ 8{
44 YESNO_YES, 9 YESNO_YES,
diff --git a/apps/keymaps/keymap-h1x0_h3x0.c b/apps/keymaps/keymap-h1x0_h3x0.c
new file mode 100644
index 0000000000..7e11c27dfc
--- /dev/null
+++ b/apps/keymaps/keymap-h1x0_h3x0.c
@@ -0,0 +1,386 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* Button Code Definitions for iriver h100/h300 target */
20#include <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23
24#include "config.h"
25#include "action.h"
26#include "button.h"
27#include "lcd-remote.h" /* for remote_type() */
28#include "settings.h"
29
30/*
31 * The format of the list is as follows
32 * { Action Code, Button code, Prereq button code }
33 * if there's no need to check the previous button's value, use BUTTON_NONE
34 * Insert LAST_ITEM_IN_LIST at the end of each mapping
35 */
36
37/* CONTEXT_CUSTOM's used in this file...
38
39CONTEXT_CUSTOM|CONTEXT_TREE = the standard list/tree defines (without directions)
40
41
42*/
43
44
45struct button_mapping button_context_standard[] = {
46 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
47 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
48 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
49 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
50
51 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
52 { ACTION_STD_CANCEL, BUTTON_OFF, BUTTON_NONE },
53 { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT },
54 { ACTION_STD_QUICKSCREEN, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE },
55 { ACTION_STD_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE },
56 { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
57 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
58
59 LAST_ITEM_IN_LIST
60}; /* button_context_standard */
61
62
63struct button_mapping button_context_wps[] = {
64 { ACTION_WPS_PLAY, BUTTON_ON|BUTTON_REL, BUTTON_ON },
65 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
66 { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
67 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
68 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
69 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
70 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
71 { ACTION_WPS_NEXTDIR, BUTTON_ON|BUTTON_RIGHT, BUTTON_ON },
72 { ACTION_WPS_PREVDIR, BUTTON_ON|BUTTON_LEFT, BUTTON_ON },
73 { ACTION_WPS_STOP, BUTTON_OFF, BUTTON_NONE },
74 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_DOWN },
75 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
76 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REL, BUTTON_UP },
77 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
78 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_REPEAT, BUTTON_ON },
79 { ACTION_WPS_QUICKSCREEN, BUTTON_MODE|BUTTON_REPEAT, BUTTON_MODE },
80 { ACTION_WPS_MENU, BUTTON_MODE|BUTTON_REL, BUTTON_MODE },
81 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
82 { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
83 { ACTION_WPSAB_RESET, BUTTON_ON|BUTTON_SELECT, BUTTON_ON },
84
85 LAST_ITEM_IN_LIST
86}; /* button_context_wps */
87
88struct button_mapping button_context_listtree[] = {
89 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP, BUTTON_ON },
90 { ACTION_LISTTREE_PGUP, BUTTON_UP|BUTTON_REL, BUTTON_ON|BUTTON_UP },
91 { ACTION_LISTTREE_PGUP, BUTTON_ON|BUTTON_UP|BUTTON_REPEAT, BUTTON_ON|BUTTON_UP },
92 { ACTION_LISTTREE_PGDOWN, BUTTON_ON|BUTTON_DOWN, BUTTON_ON|BUTTON_UP },
93 { ACTION_LISTTREE_PGDOWN, BUTTON_DOWN|BUTTON_REL, BUTTON_ON|BUTTON_DOWN },
94 { ACTION_LISTTREE_PGDOWN, BUTTON_ON|BUTTON_DOWN|BUTTON_REPEAT, BUTTON_ON|BUTTON_DOWN },
95 LAST_ITEM_IN_LIST
96}; /* button_context_listtree */
97
98struct button_mapping button_context_tree[] = {
99 { ACTION_TREE_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON },
100 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
101}; /* button_context_listtree */
102
103struct button_mapping button_context_listtree_scroll_with_combo[] = {
104 { ACTION_NONE, BUTTON_ON, BUTTON_NONE },
105 { ACTION_TREE_PGLEFT, BUTTON_ON|BUTTON_LEFT, BUTTON_ON },
106 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_ON|BUTTON_LEFT },
107 { ACTION_TREE_PGLEFT, BUTTON_ON|BUTTON_LEFT, BUTTON_LEFT|BUTTON_REL },
108 { ACTION_TREE_PGLEFT, BUTTON_ON|BUTTON_LEFT|BUTTON_REPEAT, BUTTON_ON|BUTTON_LEFT },
109 { ACTION_TREE_PGRIGHT, BUTTON_ON|BUTTON_RIGHT, BUTTON_ON },
110 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_ON|BUTTON_RIGHT },
111 { ACTION_TREE_PGRIGHT, BUTTON_ON|BUTTON_RIGHT, BUTTON_RIGHT|BUTTON_REL },
112 { ACTION_TREE_PGRIGHT, BUTTON_ON|BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_ON|BUTTON_RIGHT },
113 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
114};
115
116struct button_mapping button_context_listtree_scroll_without_combo[] = {
117 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
118 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
119 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
120 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
121 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
122 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
123 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
124 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
125 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
126};
127
128struct button_mapping button_context_settings[] = {
129 { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
130 { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
131 { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
132 { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
133 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
134 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
135
136 LAST_ITEM_IN_LIST
137}; /* button_context_settings */
138
139struct button_mapping button_context_settingsgraphical[] = {
140 { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE },
141 { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
142 { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE },
143 { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
144 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
145 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
146 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
147 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
148
149 LAST_ITEM_IN_LIST
150}; /* button_context_settingsgraphical */
151
152struct button_mapping button_context_yesno[] = {
153 { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE },
154 { ACTION_YESNO_ACCEPT, BUTTON_RC_ON, BUTTON_NONE },
155 LAST_ITEM_IN_LIST
156}; /* button_context_settings_yesno */
157
158struct button_mapping button_context_bmark[] = {
159 { ACTION_BMARK_DELETE, BUTTON_REC, BUTTON_NONE },
160 { ACTION_STD_OK, BUTTON_SELECT, BUTTON_NONE },
161 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGSGRAPHICAL),
162}; /* button_context_settings_bmark */
163
164struct button_mapping button_context_quickscreen[] = {
165 { ACTION_QS_DOWNINV, BUTTON_UP, BUTTON_NONE },
166 { ACTION_QS_DOWNINV, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
167 { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE },
168 { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
169 { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE },
170 { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
171 { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE },
172 { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
173 { ACTION_STD_CANCEL, BUTTON_MODE, BUTTON_NONE },
174
175 LAST_ITEM_IN_LIST
176}; /* button_context_quickscreen */
177/*****************************************************************************
178 * Remote control mappings
179 *****************************************************************************/
180
181
182/********* H100 LCD remote ******/
183struct button_mapping button_context_standard_h100lcdremote[] = {
184 { ACTION_STD_PREV, BUTTON_RC_REW, BUTTON_NONE },
185 { ACTION_STD_PREVREPEAT, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
186 { ACTION_STD_NEXT, BUTTON_RC_FF, BUTTON_NONE },
187 { ACTION_STD_NEXTREPEAT, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
188
189 { ACTION_STD_OK, BUTTON_RC_ON|BUTTON_REL, BUTTON_RC_ON },
190 { ACTION_STD_CONTEXT, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU },
191 { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE },
192 { ACTION_STD_QUICKSCREEN, BUTTON_RC_MODE|BUTTON_REPEAT, BUTTON_RC_MODE },
193 { ACTION_STD_MENU, BUTTON_RC_MODE|BUTTON_REL, BUTTON_RC_MODE },
194 { ACTION_STD_OK, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU },
195
196 LAST_ITEM_IN_LIST
197}; /* button_context_standard_h100lcdremote */
198
199struct button_mapping button_context_wps_h100lcdremote[] = {
200 { ACTION_WPS_PLAY, BUTTON_RC_ON|BUTTON_REL, BUTTON_RC_ON },
201 { ACTION_WPS_SKIPNEXT, BUTTON_RC_FF|BUTTON_REL, BUTTON_RC_FF },
202 { ACTION_WPS_SEEKFWD, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_RC_FF },
203 { ACTION_WPS_SKIPPREV, BUTTON_RC_REW|BUTTON_REL, BUTTON_RC_REW },
204 { ACTION_WPS_SEEKBACK, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
205 { ACTION_WPS_STOP, BUTTON_RC_STOP, BUTTON_NONE },
206 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
207 { ACTION_WPS_VOLDOWN, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_RC_VOL_DOWN },
208 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP, BUTTON_NONE },
209 { ACTION_WPS_VOLUP, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_RC_VOL_UP },
210 { ACTION_WPS_NEXTDIR, BUTTON_RC_BITRATE, BUTTON_NONE },
211 { ACTION_WPS_PREVDIR, BUTTON_RC_SOURCE, BUTTON_NONE },
212 { ACTION_WPS_PITCHSCREEN, BUTTON_RC_ON|BUTTON_REPEAT, BUTTON_RC_ON },
213 { ACTION_WPS_QUICKSCREEN, BUTTON_RC_MODE|BUTTON_REPEAT, BUTTON_RC_MODE },
214 { ACTION_WPS_MENU, BUTTON_RC_MODE|BUTTON_REL, BUTTON_RC_MODE },
215 { ACTION_WPS_CONTEXT, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU },
216 { ACTION_WPS_BROWSE, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU },
217
218 LAST_ITEM_IN_LIST
219}; /* button_context_wps_h100lcdremote */
220
221struct button_mapping button_context_listtree_h100lcdremote[] = {
222 { ACTION_LISTTREE_PGUP, BUTTON_RC_SOURCE, BUTTON_NONE },
223 { ACTION_LISTTREE_PGUP, BUTTON_RC_SOURCE|BUTTON_REPEAT, BUTTON_RC_SOURCE },
224 { ACTION_LISTTREE_PGDOWN, BUTTON_RC_BITRATE, BUTTON_NONE },
225 { ACTION_LISTTREE_PGDOWN, BUTTON_RC_BITRATE|BUTTON_REPEAT, BUTTON_RC_BITRATE },
226 { ACTION_TREE_WPS, BUTTON_RC_ON|BUTTON_REL, BUTTON_RC_ON },
227 { ACTION_TREE_STOP, BUTTON_RC_STOP, BUTTON_NONE },
228
229 LAST_ITEM_IN_LIST
230}; /* button_context_listtree_h100lcdremote */
231/* Not needed? _std_ actions seem to be fine */
232struct button_mapping button_context_settings_h100lcdremote[] = {
233 LAST_ITEM_IN_LIST
234};/* button_context_settings_h100lcdremote */
235
236
237/********* H300 LCD remote ******/
238struct button_mapping button_context_standard_h300lcdremote[] = {
239 { ACTION_STD_PREV, BUTTON_RC_VOL_UP, BUTTON_NONE },
240 { ACTION_STD_PREVREPEAT, BUTTON_RC_VOL_UP|BUTTON_REPEAT, BUTTON_RC_VOL_UP },
241 { ACTION_STD_NEXT, BUTTON_RC_VOL_DOWN, BUTTON_NONE },
242 { ACTION_STD_NEXTREPEAT, BUTTON_RC_VOL_DOWN|BUTTON_REPEAT, BUTTON_RC_VOL_DOWN },
243 { ACTION_STD_OK, BUTTON_RC_ON|BUTTON_REL, BUTTON_RC_ON },
244 { ACTION_STD_CANCEL, BUTTON_RC_REW, BUTTON_NONE },
245 { ACTION_STD_CANCEL, BUTTON_RC_REW|BUTTON_REPEAT, BUTTON_RC_REW },
246 { ACTION_STD_CONTEXT, BUTTON_RC_MENU|BUTTON_REPEAT, BUTTON_RC_MENU },
247 { ACTION_STD_CANCEL, BUTTON_RC_STOP, BUTTON_NONE },
248 { ACTION_STD_QUICKSCREEN, BUTTON_RC_MODE|BUTTON_REPEAT, BUTTON_RC_MODE },
249 { ACTION_STD_MENU, BUTTON_RC_MODE|BUTTON_REL, BUTTON_RC_MODE },
250 { ACTION_STD_OK, BUTTON_RC_MENU|BUTTON_REL, BUTTON_RC_MENU },
251 { ACTION_STD_OK, BUTTON_RC_FF, BUTTON_NONE },
252 { ACTION_STD_OK, BUTTON_RC_FF|BUTTON_REPEAT, BUTTON_NONE},
253
254 LAST_ITEM_IN_LIST
255
256}; /* button_context_standard */
257
258/* the mapping of the 2 LCD remotes in the WPS screen should be the same */
259struct button_mapping *button_context_wps_h300lcdremote =
260 button_context_wps_h100lcdremote;
261
262/* FIXME: the same as h100 ?? */
263struct button_mapping *button_context_listtree_h300lcdremote =
264 button_context_listtree_h100lcdremote;
265/* FIXME: the same as h100 ?? */
266
267struct button_mapping *button_context_settings_h300lcdremote =
268 button_context_settings_h100lcdremote;
269/* FIXME: non lcd remotes need mappings.. ?? */
270
271
272
273
274
275
276/* the actual used tables */
277static struct button_mapping
278 *remote_button_context_std = button_context_standard_h100lcdremote,
279 *remote_button_context_wps = button_context_wps_h100lcdremote,
280 *remote_button_context_listtree = button_context_listtree_h100lcdremote,
281 *remote_button_context_settings = button_context_settings_h100lcdremote;
282static int _remote_type = 0;
283
284static void remap_remote(void)
285{
286 _remote_type = remote_type();
287 switch(_remote_type)
288 {
289 case REMOTETYPE_UNPLUGGED:
290 remote_button_context_std = NULL;
291 remote_button_context_wps = NULL;
292 remote_button_context_listtree = NULL;
293 remote_button_context_settings = NULL;
294 break;
295 case REMOTETYPE_H100_LCD:
296 remote_button_context_std = button_context_standard_h100lcdremote;
297 remote_button_context_wps = button_context_wps_h100lcdremote;
298 remote_button_context_listtree = button_context_listtree_h100lcdremote;
299 remote_button_context_settings = button_context_settings_h100lcdremote;
300 break;
301 case REMOTETYPE_H300_LCD:
302 remote_button_context_std = button_context_standard_h300lcdremote;
303 remote_button_context_wps = button_context_wps_h300lcdremote;
304 remote_button_context_listtree = button_context_listtree_h300lcdremote;
305 remote_button_context_settings = button_context_settings_h300lcdremote;
306 break;
307 case REMOTETYPE_H300_NONLCD: /* FIXME: add its tables */
308 remote_button_context_std = button_context_standard_h300lcdremote;
309 remote_button_context_wps = button_context_wps_h300lcdremote;
310 remote_button_context_listtree = button_context_listtree_h300lcdremote;
311 remote_button_context_settings = button_context_settings_h300lcdremote;
312 break;
313 }
314}
315
316
317
318
319
320
321
322
323struct button_mapping* get_context_mapping_remote(int context)
324{
325 if(remote_type() != _remote_type)
326 remap_remote();
327 context ^= CONTEXT_REMOTE;
328
329 switch (context)
330 {
331 case CONTEXT_STD:
332 case CONTEXT_MAINMENU:
333 case CONTEXT_SETTINGS:
334 return remote_button_context_std;
335 case CONTEXT_WPS:
336 return remote_button_context_wps;
337
338 case CONTEXT_TREE:
339 case CONTEXT_LIST:
340 return remote_button_context_listtree;
341
342
343 case CONTEXT_YESNOSCREEN:
344 case CONTEXT_BOOKMARKSCREEN:
345 ; /* fall out of the switch */
346 }
347 return remote_button_context_std;
348}
349
350struct button_mapping* get_context_mapping(int context)
351{
352 if (context&CONTEXT_REMOTE)
353 return get_context_mapping_remote(context);
354
355 switch (context)
356 {
357 case CONTEXT_STD:
358 case CONTEXT_MAINMENU:
359 return button_context_standard;
360 case CONTEXT_WPS:
361 return button_context_wps;
362
363 case CONTEXT_LIST:
364 return button_context_listtree;
365 case CONTEXT_TREE:
366 if (global_settings.hold_lr_for_scroll_in_list)
367 return button_context_listtree_scroll_without_combo;
368 else return button_context_listtree_scroll_with_combo;
369 case CONTEXT_CUSTOM|1:
370 return button_context_tree;
371 case CONTEXT_SETTINGSGRAPHICAL:
372 return button_context_settingsgraphical;
373
374 case CONTEXT_SETTINGS:
375 return button_context_settings;
376
377 case CONTEXT_YESNOSCREEN:
378 return button_context_yesno;
379
380 case CONTEXT_BOOKMARKSCREEN:
381 return button_context_bmark;
382 case CONTEXT_QUICKSCREEN:
383 return button_context_quickscreen;
384 }
385 return button_context_standard;
386}
diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c
new file mode 100644
index 0000000000..91254a39a8
--- /dev/null
+++ b/apps/keymaps/keymap-ipod.c
@@ -0,0 +1,151 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* Button Code Definitions for ipod target */
20
21#include "config.h"
22#include "action.h"
23#include "button.h"
24
25
26/*
27 * The format of the list is as follows
28 * { Action Code, Button code, Prereq button code }
29 * if there's no need to check the previous button's value, use BUTTON_NONE
30 * Insert LAST_ITEM_IN_LIST at the end of each mapping
31 */
32
33/* CONTEXT_CUSTOM's used in this file...
34
35CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
36
37
38*/
39
40struct button_mapping button_context_standard[] = {
41 { ACTION_STD_PREV, BUTTON_SCROLL_BACK, BUTTON_NONE },
42 { ACTION_STD_PREVREPEAT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_SCROLL_BACK },
43 { ACTION_STD_NEXT, BUTTON_SCROLL_FWD, BUTTON_NONE },
44 { ACTION_STD_NEXTREPEAT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_SCROLL_FWD },
45 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
46 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
47
48 { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
49 { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
50 { ACTION_STD_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
51 { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
52 { ACTION_STD_CANCEL, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
53
54 LAST_ITEM_IN_LIST
55}; /* button_context_standard */
56struct button_mapping button_context_tree[] = {
57 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
58 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
59
60 LAST_ITEM_IN_LIST
61}; /* button_context_tree */
62
63struct button_mapping button_context_tree_scroll_lr[] = {
64 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
65 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
66 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
67 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
68 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
69 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
70 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
71 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
72 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
73};
74
75struct button_mapping button_context_wps[] = {
76 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
77 { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
78 { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
79 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
80 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
81 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
82 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
83 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
84 { ACTION_WPS_VOLDOWN, BUTTON_SCROLL_BACK, BUTTON_NONE },
85 { ACTION_WPS_VOLDOWN, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_SCROLL_BACK },
86 { ACTION_WPS_VOLUP, BUTTON_SCROLL_FWD, BUTTON_NONE },
87 { ACTION_WPS_VOLUP, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_SCROLL_FWD },
88 { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
89 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
90 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
91 { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
92
93 LAST_ITEM_IN_LIST
94}; /* button_context_wps */
95
96struct button_mapping button_context_settings[] = {
97 { ACTION_SETTINGS_INC, BUTTON_SCROLL_FWD, BUTTON_NONE },
98 { ACTION_SETTINGS_INCREPEAT, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_SCROLL_FWD },
99 { ACTION_SETTINGS_DEC, BUTTON_SCROLL_BACK, BUTTON_NONE },
100 { ACTION_SETTINGS_DECREPEAT, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_SCROLL_BACK },
101 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
102 { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
103 { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE },
104 { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
105 { ACTION_STD_CANCEL, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, /* rel so bmark screen works */
106
107 LAST_ITEM_IN_LIST
108}; /* button_context_settings */
109
110struct button_mapping button_context_yesno[] = {
111 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
112 LAST_ITEM_IN_LIST
113}; /* button_context_settings_yesno */
114
115struct button_mapping button_context_bmark[] = {
116 { ACTION_BMARK_DELETE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
117 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
118}; /* button_context_settings_bmark */
119
120/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
121struct button_mapping* get_context_mapping(int context)
122{
123 switch (context)
124 {
125 case CONTEXT_STD:
126 return button_context_standard;
127 case CONTEXT_WPS:
128 return button_context_wps;
129
130 case CONTEXT_TREE:
131 if (global_settings.hold_lr_for_scroll_in_list)
132 return button_context_tree_scroll_lr;
133 /* else fall through to CUSTOM|1 */
134 case CONTEXT_CUSTOM|1:
135 return button_context_tree;
136
137 case CONTEXT_LIST:
138 case CONTEXT_MAINMENU:
139 break;
140 case CONTEXT_SETTINGS:
141 case CONTEXT_SETTINGSGRAPHICAL:
142 return button_context_settings;
143 case CONTEXT_YESNOSCREEN:
144 return button_context_yesno;
145 case CONTEXT_BOOKMARKSCREEN:
146 return button_context_bmark;
147 default:
148 return button_context_standard;
149 }
150 return button_context_standard;
151}
diff --git a/apps/keymaps/keymap-newtarget.c b/apps/keymaps/keymap-newtarget.c
new file mode 100644
index 0000000000..3cd828c0b4
--- /dev/null
+++ b/apps/keymaps/keymap-newtarget.c
@@ -0,0 +1,77 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 200
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* Button Code Definitions for <new> target */
20
21#include "config.h"
22#include "action.h"
23#include "button.h"
24
25#define LAST_ITEM_IN_LIST { ACTION_NONE,BUTTON_NONE,BUTTON_NONE }
26/* {Action Code, Button code, Prereq button code } */
27
28/**
29 This file is where all button mappings are defined.
30 In ../action.h there is an enum with all the used ACTION_ codes.
31 Ideally All the ACTION_STD_* and ACTION_WPS_* codes should be defined somehwere in this file.
32
33 Remeber to make a copy of this file and rename it to keymap-<targetname>.c and add it to apps/SOURCES
34
35 Good luck and thanks for porting a new target! :D
36
37**/
38
39/*
40 * The format of the list is as follows
41 * { Action Code, Button code, Prereq button code }
42 * if there's no need to check the previous button's value, use BUTTON_NONE
43 * Insert LAST_ITEM_IN_LIST at the end of each mapping
44 */
45struct button_mapping button_context_standard[] = {
46
47 LAST_ITEM_IN_LIST
48}; /* button_context_standard */
49
50struct button_mapping button_context_wps[] = {
51
52 LAST_ITEM_IN_LIST
53}; /* button_context_wps */
54
55
56
57/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
58struct button_mapping* get_context_mapping(int context)
59{
60 switch (context)
61 {
62 case CONTEXT_STD:
63 return button_context_standard;
64 case CONTEXT_WPS:
65 return button_context_wps;
66
67 case CONTEXT_TREE:
68 case CONTEXT_LIST:
69 case CONTEXT_MAINMENU:
70
71 case CONTEXT_SETTINGS:
72 case CONTEXT_SETTINGS|CONTEXT_REMOTE:
73 default:
74 return button_context_standard;
75 }
76 return button_context_standard;
77}
diff --git a/apps/keymaps/keymap-ondio.c b/apps/keymaps/keymap-ondio.c
new file mode 100644
index 0000000000..2ad86c868d
--- /dev/null
+++ b/apps/keymaps/keymap-ondio.c
@@ -0,0 +1,135 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* *
20 * Button Code Definitions for archos ondio fm/sp targets
21 *
22 * \TODO test!
23 */
24
25#include "config.h"
26#include "action.h"
27#include "button.h"
28#include "settings.h"
29
30/* CONTEXT_CUSTOM's used in this file...
31
32CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
33
34
35*/
36
37struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
40 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
42
43 { ACTION_STD_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
44 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
45 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
46 { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
47 { ACTION_STD_CANCEL, BUTTON_OFF, BUTTON_NONE },
48
49 LAST_ITEM_IN_LIST
50};
51
52struct button_mapping button_context_wps[] = {
53 { ACTION_WPS_PLAY, BUTTON_OFF|BUTTON_REL, BUTTON_OFF },
54 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE },
55 { ACTION_WPS_SKIPPREV, BUTTON_LEFT, BUTTON_NONE },
56 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
57 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
58 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
59 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
60 { ACTION_WPS_STOP, BUTTON_OFF|BUTTON_REPEAT, BUTTON_OFF },
61 { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE },
62 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
63 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
64 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
65 { ACTION_WPS_BROWSE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
66 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
67 { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_OFF, BUTTON_MENU }, /* this may trigger ACTION_WPS_BROWSE so may need changing */
68
69 LAST_ITEM_IN_LIST
70};
71
72struct button_mapping button_context_settings[] = {
73 { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
74 { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
75 { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
76 { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
77 { ACTION_STD_NEXT, BUTTON_MENU, BUTTON_NONE },
78 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
79 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
80
81 LAST_ITEM_IN_LIST
82};
83struct button_mapping button_context_tree[] = {
84 { ACTION_TREE_WPS, BUTTON_OFF|BUTTON_REL, BUTTON_OFF },
85 { ACTION_TREE_STOP, BUTTON_OFF|BUTTON_REPEAT, BUTTON_OFF },
86
87 LAST_ITEM_IN_LIST
88}; /* button_context_listtree */
89struct button_mapping button_context_tree_scroll_lr[] = {
90 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
91 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
92 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
93 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
94 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
95 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
96 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
97 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
98 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
99};
100
101struct button_mapping button_context_yesno[] = {
102 { ACTION_YESNO_ACCEPT, BUTTON_RIGHT, BUTTON_NONE },
103
104 LAST_ITEM_IN_LIST
105};
106
107struct button_mapping* get_context_mapping( int context )
108{
109 switch( context )
110 {
111 case CONTEXT_STD:
112 return button_context_standard;
113
114 case CONTEXT_WPS:
115 return button_context_wps;
116
117 case CONTEXT_SETTINGS:
118 return button_context_settings;
119
120 case CONTEXT_YESNOSCREEN:
121 return button_context_yesno;
122
123 case CONTEXT_TREE:
124 if (global_settings.hold_lr_for_scroll_in_list)
125 return button_context_tree_scroll_lr;
126 /* else fall through to CUSTOM|1 */
127 case CONTEXT_CUSTOM|1:
128 return button_context_tree;
129
130 case CONTEXT_LIST:
131 case CONTEXT_MAINMENU:
132 default:
133 return button_context_standard;
134 }
135}
diff --git a/apps/keymaps/keymap-player.c b/apps/keymaps/keymap-player.c
new file mode 100644
index 0000000000..f1a98d7b35
--- /dev/null
+++ b/apps/keymaps/keymap-player.c
@@ -0,0 +1,136 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* *
20 * Button Code Definitions for archos player targets
21 *
22 * \TODO test!
23 */
24
25#include "config.h"
26#include "action.h"
27#include "button.h"
28#include "settings.h"
29
30/* CONTEXT_CUSTOM's used in this file...
31
32CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
33
34
35*/
36
37struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
40 { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
42
43 { ACTION_STD_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
44 { ACTION_STD_CANCEL, BUTTON_STOP, BUTTON_NONE },
45 { ACTION_STD_OK, BUTTON_PLAY, BUTTON_NONE },
46 { ACTION_STD_OK, BUTTON_ON|BUTTON_REL, BUTTON_ON },
47 { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
48
49 LAST_ITEM_IN_LIST
50};
51
52struct button_mapping button_context_wps[] = {
53 { ACTION_WPS_PLAY, BUTTON_PLAY, BUTTON_NONE },
54 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE },
55 { ACTION_WPS_SKIPPREV, BUTTON_LEFT, BUTTON_NONE },
56 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
57 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
58 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
59 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
60 { ACTION_WPS_STOP, BUTTON_STOP, BUTTON_NONE },
61
62 { ACTION_WPS_VOLDOWN, BUTTON_MENU|BUTTON_STOP, BUTTON_MENU },
63 { ACTION_WPS_VOLDOWN, BUTTON_MENU|BUTTON_STOP|BUTTON_REPEAT, BUTTON_MENU|BUTTON_STOP },
64 { ACTION_WPS_VOLUP, BUTTON_MENU|BUTTON_PLAY, BUTTON_MENU },
65 { ACTION_WPS_VOLUP, BUTTON_MENU|BUTTON_PLAY|BUTTON_REPEAT, BUTTON_MENU|BUTTON_PLAY },
66
67 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON },
68 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
69 { ACTION_WPS_CONTEXT, BUTTON_ON|BUTTON_REPEAT, BUTTON_ON },
70 { ACTION_WPS_ID3SCREEN, BUTTON_MENU|BUTTON_ON, BUTTON_MENU },
71
72
73 LAST_ITEM_IN_LIST
74};
75
76struct button_mapping button_context_settings[] = {
77 { ACTION_SETTINGS_INC, BUTTON_LEFT, BUTTON_NONE },
78 { ACTION_SETTINGS_INCREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
79 { ACTION_SETTINGS_DEC, BUTTON_RIGHT, BUTTON_NONE },
80 { ACTION_SETTINGS_DECREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
81
82 LAST_ITEM_IN_LIST
83};
84
85struct button_mapping button_context_tree[] = {
86 { ACTION_TREE_WPS, BUTTON_PLAY, BUTTON_NONE },
87 { ACTION_TREE_STOP, BUTTON_STOP, BUTTON_NONE },
88
89 LAST_ITEM_IN_LIST
90}; /* button_context_listtree */
91struct button_mapping button_context_tree_scroll_lr[] = {
92 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
93 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
94 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
95 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
96 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
97 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
98 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
99 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
100 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
101};
102
103struct button_mapping button_context_yesno[] = {
104 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
105 LAST_ITEM_IN_LIST
106}; /* button_context_settings_yesno */
107
108struct button_mapping* get_context_mapping( int context )
109{
110 switch( context )
111 {
112 case CONTEXT_STD:
113 return button_context_standard;
114
115 case CONTEXT_WPS:
116 return button_context_wps;
117
118 case CONTEXT_SETTINGS:
119 return button_context_settings;
120
121 case CONTEXT_YESNOSCREEN:
122 return button_context_yesno;
123
124 case CONTEXT_TREE:
125 if (global_settings.hold_lr_for_scroll_in_list)
126 return button_context_tree_scroll_lr;
127 /* else fall through to CUSTOM|1 */
128 case CONTEXT_CUSTOM|1:
129 return button_context_tree;
130
131 case CONTEXT_LIST:
132 case CONTEXT_MAINMENU:
133 default:
134 return button_context_standard;
135 }
136}
diff --git a/apps/keymaps/keymap-recorder.c b/apps/keymaps/keymap-recorder.c
new file mode 100644
index 0000000000..ab75bc51e7
--- /dev/null
+++ b/apps/keymaps/keymap-recorder.c
@@ -0,0 +1,141 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Antoine Cellerier <dionoea @t videolan d.t org>
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* *
20 * Button Code Definitions for archos recorder target
21 *
22 * \TODO handle F3
23 */
24
25#include "config.h"
26#include "action.h"
27#include "button.h"
28#include "settings.h"
29
30/* CONTEXT_CUSTOM's used in this file...
31
32CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
33
34
35*/
36
37struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
40 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
42
43 { ACTION_STD_OK, BUTTON_ON, BUTTON_NONE },
44 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
45 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
46
47 { ACTION_STD_OK, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
48 { ACTION_STD_MENU, BUTTON_F1, BUTTON_NONE },
49 { ACTION_STD_QUICKSCREEN, BUTTON_F2, BUTTON_NONE },
50 { ACTION_STD_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
51 { ACTION_STD_CANCEL, BUTTON_OFF, BUTTON_NONE },
52 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
53 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
54
55 LAST_ITEM_IN_LIST
56};
57
58struct button_mapping button_context_wps[] = {
59 { ACTION_WPS_PLAY, BUTTON_PLAY, BUTTON_NONE },
60 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT, BUTTON_NONE },
61 { ACTION_WPS_SKIPPREV, BUTTON_LEFT, BUTTON_NONE },
62 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
63 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
64 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
65 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
66 { ACTION_WPS_STOP, BUTTON_OFF, BUTTON_NONE },
67 { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE },
68 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
69 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
70 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
71 { ACTION_WPS_MENU, BUTTON_F1, BUTTON_NONE },
72 { ACTION_WPS_CONTEXT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
73 { ACTION_WPS_QUICKSCREEN, BUTTON_F2, BUTTON_NONE },
74 { ACTION_WPS_BROWSE, BUTTON_ON|BUTTON_REL, BUTTON_ON },
75 { ACTION_WPS_ID3SCREEN, BUTTON_F1|BUTTON_ON, BUTTON_F1 },
76 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_UP, BUTTON_ON },
77 { ACTION_WPS_PITCHSCREEN, BUTTON_ON|BUTTON_DOWN, BUTTON_ON },
78
79 LAST_ITEM_IN_LIST
80};
81
82struct button_mapping button_context_settings[] = {
83 { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
84 { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
85 { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
86 { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
87
88 LAST_ITEM_IN_LIST
89};
90
91struct button_mapping button_context_tree[] = {
92 { ACTION_TREE_WPS, BUTTON_PLAY, BUTTON_NONE },
93 { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE },
94
95 LAST_ITEM_IN_LIST
96}; /* button_context_listtree */
97struct button_mapping button_context_tree_scroll_lr[] = {
98 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
99 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
100 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
101 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
102 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
103 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
104 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
105 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
106 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
107};
108
109struct button_mapping button_context_yesno[] = {
110 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE },
111
112 LAST_ITEM_IN_LIST
113};
114
115struct button_mapping* get_context_mapping( int context )
116{
117 switch( context )
118 {
119 case CONTEXT_WPS:
120 return button_context_wps;
121
122 case CONTEXT_SETTINGS:
123 return button_context_settings;
124
125 case CONTEXT_YESNOSCREEN:
126 return button_context_yesno;
127
128 case CONTEXT_TREE:
129 if (global_settings.hold_lr_for_scroll_in_list)
130 return button_context_tree_scroll_lr;
131 /* else fall through to CUSTOM|1 */
132 case CONTEXT_CUSTOM|1:
133 return button_context_tree;
134
135 case CONTEXT_STD:
136 case CONTEXT_LIST:
137 case CONTEXT_MAINMENU:
138 default:
139 return button_context_standard;
140 }
141}
diff --git a/apps/keymaps/keymap-x5.c b/apps/keymaps/keymap-x5.c
new file mode 100644
index 0000000000..33c1946e6c
--- /dev/null
+++ b/apps/keymaps/keymap-x5.c
@@ -0,0 +1,141 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2006 Jonathan Gordon
10 *
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
13 *
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
16 *
17 ****************************************************************************/
18
19/* *
20 * Button Code Definitions for iaudio x5 targets
21 *
22 * \TODO test!
23 */
24
25#include "config.h"
26#include "action.h"
27#include "button.h"
28#include "settings.h"
29
30/* CONTEXT_CUSTOM's used in this file...
31
32CONTEXT_CUSTOM|1 = the standard list/tree defines (without directions)
33
34
35*/
36
37struct button_mapping button_context_standard[] = {
38 { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE },
39 { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
40 { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE },
41 { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
42
43 { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
44 { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE },
45 { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE },
46 { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
47 { ACTION_STD_OK, BUTTON_PLAY, BUTTON_NONE },
48 { ACTION_STD_MENU, BUTTON_REC|BUTTON_REL, BUTTON_REC },
49 { ACTION_STD_QUICKSCREEN,BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
50 { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE },
51
52 LAST_ITEM_IN_LIST
53};
54
55struct button_mapping button_context_wps[] = {
56 { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
57 { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
58 { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
59 { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
60 { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
61 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
62 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
63 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
64
65 { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE },
66 { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_DOWN },
67 { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE },
68 { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP },
69
70 { ACTION_WPS_BROWSE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT },
71 { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT },
72 { ACTION_WPS_MENU, BUTTON_REC|BUTTON_REL, BUTTON_REC },
73 { ACTION_WPS_QUICKSCREEN, BUTTON_REC|BUTTON_REPEAT, BUTTON_REC },
74
75
76 LAST_ITEM_IN_LIST
77};
78
79struct button_mapping button_context_settings[] = {
80 { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE },
81 { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE },
82 { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE },
83 { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE },
84 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE },
85 { ACTION_STD_CANCEL, BUTTON_REC, BUTTON_NONE },
86
87 LAST_ITEM_IN_LIST
88};
89struct button_mapping button_context_tree[] = {
90 { ACTION_NONE, BUTTON_PLAY, BUTTON_NONE },
91 { ACTION_TREE_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
92 { ACTION_TREE_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY },
93
94 LAST_ITEM_IN_LIST
95}; /* button_context_listtree */
96struct button_mapping button_context_tree_scroll_lr[] = {
97 { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE },
98 { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT },
99 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_LEFT },
100 { ACTION_TREE_PGLEFT, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT },
101 { ACTION_NONE, BUTTON_RIGHT, BUTTON_NONE },
102 { ACTION_STD_OK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT },
103 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_RIGHT },
104 { ACTION_TREE_PGRIGHT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT },
105 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|1),
106};
107
108struct button_mapping button_context_yesno[] = {
109 { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE },
110 LAST_ITEM_IN_LIST
111}; /* button_context_settings_yesno */
112
113struct button_mapping* get_context_mapping( int context )
114{
115 switch( context )
116 {
117 case CONTEXT_STD:
118 return button_context_standard;
119
120 case CONTEXT_WPS:
121 return button_context_wps;
122
123 case CONTEXT_SETTINGS:
124 return button_context_settings;
125
126 case CONTEXT_YESNOSCREEN:
127 return button_context_yesno;
128
129 case CONTEXT_TREE:
130 if (global_settings.hold_lr_for_scroll_in_list)
131 return button_context_tree_scroll_lr;
132 /* else fall through to CUSTOM|1 */
133 case CONTEXT_CUSTOM|1:
134 return button_context_tree;
135
136 case CONTEXT_LIST:
137 case CONTEXT_MAINMENU:
138 default:
139 return button_context_standard;
140 }
141}
diff --git a/apps/logfdisp.c b/apps/logfdisp.c
index 9d62383da4..734a6aec63 100644
--- a/apps/logfdisp.c
+++ b/apps/logfdisp.c
@@ -24,20 +24,12 @@
24#include <timefuncs.h> 24#include <timefuncs.h>
25#include <string.h> 25#include <string.h>
26#include <kernel.h> 26#include <kernel.h>
27#include <button.h> 27#include <action.h>
28 28
29#include <lcd.h> 29#include <lcd.h>
30#include "menu.h" 30#include "menu.h"
31#include "logf.h" 31#include "logf.h"
32 32
33#if (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
34#define LOGF_BUTTON_QUIT BUTTON_MENU
35#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
36#define LOGF_BUTTON_QUIT BUTTON_POWER
37#else
38#define LOGF_BUTTON_QUIT BUTTON_OFF
39#endif
40
41#ifdef HAVE_LCD_BITMAP 33#ifdef HAVE_LCD_BITMAP
42bool logfdisplay(void) 34bool logfdisplay(void)
43 35
@@ -46,7 +38,6 @@ bool logfdisplay(void)
46 int lines; 38 int lines;
47 int columns; 39 int columns;
48 int i; 40 int i;
49 int button;
50 41
51 bool lcd = false; /* fixed atm */ 42 bool lcd = false; /* fixed atm */
52 int index; 43 int index;
@@ -93,8 +84,7 @@ bool logfdisplay(void)
93 lcd_puts(0, i, buffer); 84 lcd_puts(0, i, buffer);
94 } 85 }
95 lcd_update(); 86 lcd_update();
96 button = button_get_w_tmo(HZ/2); 87 } while(!action_userabort(HZ));
97 } while(button != LOGF_BUTTON_QUIT);
98 88
99 return false; 89 return false;
100} 90}
diff --git a/apps/main.c b/apps/main.c
index 95e6663ba0..c50af865fc 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -365,7 +365,7 @@ void init(void)
365 lcd_puts(0, 1, str); 365 lcd_puts(0, 1, str);
366 lcd_puts(0, 3, "Press ON to debug"); 366 lcd_puts(0, 3, "Press ON to debug");
367 lcd_update(); 367 lcd_update();
368 while(!(button_get(true) & BUTTON_REL)); 368 while(!(button_get(true) & BUTTON_REL)); /*DO NOT CHANGE TO ACTION SYSTEM */
369 dbg_ports(); 369 dbg_ports();
370#endif 370#endif
371 panicf("ata: %d", rc); 371 panicf("ata: %d", rc);
diff --git a/apps/main_menu.c b/apps/main_menu.c
index bce6e20976..04527f9329 100644
--- a/apps/main_menu.c
+++ b/apps/main_menu.c
@@ -24,7 +24,7 @@
24#include "tree.h" 24#include "tree.h"
25#include "lcd.h" 25#include "lcd.h"
26#include "font.h" 26#include "font.h"
27#include "button.h" 27#include "action.h"
28#include "kernel.h" 28#include "kernel.h"
29#include "main_menu.h" 29#include "main_menu.h"
30#include "debug_menu.h" 30#include "debug_menu.h"
@@ -237,48 +237,22 @@ bool show_info(void)
237#endif 237#endif
238 238
239 /* Wait for a key to be pushed */ 239 /* Wait for a key to be pushed */
240 key = button_get_w_tmo(HZ*5); 240 key = get_action(CONTEXT_MAINMENU,HZ*5);
241 switch(key) { 241 switch(key) {
242 242
243 case SETTINGS_OK: 243 case ACTION_STD_CANCEL:
244#ifdef SETTINGS_RC_OK
245 case SETTINGS_RC_OK:
246#endif
247#ifdef SETTINGS_OK2
248 case SETTINGS_OK2:
249#endif
250#ifdef SETTINGS_RC_OK2
251 case SETTINGS_RC_OK2:
252#endif
253#ifdef SETTINGS_RC_CANCEL
254 case SETTINGS_RC_CANCEL:
255#endif
256 case SETTINGS_CANCEL:
257 done = true; 244 done = true;
258 break; 245 break;
259 246
260#ifdef HAVE_LCD_CHARCELLS 247#ifdef HAVE_LCD_CHARCELLS
261 case SETTINGS_INC: 248 case ACTION_STD_NEXT:
262 case SETTINGS_DEC: 249 case ACTION_STD_PREV:
263#ifdef SETTINGS_RC_INC
264 case SETTINGS_RC_INC:
265#endif
266#ifdef SETTINGS_RC_DEC
267 case SETTINGS_RC_DEC:
268#endif
269 page = (page == 0) ? 1 : 0; 250 page = (page == 0) ? 1 : 0;
270 break; 251 break;
271#endif 252#endif
272 253
273#ifndef SIMULATOR 254#ifndef SIMULATOR
274#ifdef SETTINGS_RC_ACCEPT 255 case ACTION_STD_OK:
275 case SETTINGS_RC_ACCEPT:
276#endif
277#ifdef SETTINGS_ACCEPT
278 case SETTINGS_ACCEPT:
279#else
280 case SETTINGS_INC: /* Ondio */
281#endif
282 gui_syncsplash(0, true, str(LANG_DIRCACHE_BUILDING)); 256 gui_syncsplash(0, true, str(LANG_DIRCACHE_BUILDING));
283 fat_recalc_free(IF_MV(0)); 257 fat_recalc_free(IF_MV(0));
284#ifdef HAVE_MULTIVOLUME 258#ifdef HAVE_MULTIVOLUME
@@ -295,7 +269,7 @@ bool show_info(void)
295 break; 269 break;
296 } 270 }
297 } 271 }
298 272 action_signalscreenchange();
299 return false; 273 return false;
300} 274}
301 275
diff --git a/apps/menu.c b/apps/menu.c
index a1c70824ce..f861e0bddf 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -40,6 +40,7 @@
40#include "talk.h" 40#include "talk.h"
41#include "lang.h" 41#include "lang.h"
42#include "misc.h" 42#include "misc.h"
43#include "action.h"
43 44
44#ifdef HAVE_LCD_BITMAP 45#ifdef HAVE_LCD_BITMAP
45#include "icons.h" 46#include "icons.h"
@@ -124,13 +125,12 @@ int menu_show(int m)
124#endif 125#endif
125 bool exit = false; 126 bool exit = false;
126 int key; 127 int key;
127 unsigned lastbutton = 0;
128 128
129 gui_synclist_draw(&(menus[m].synclist)); 129 gui_synclist_draw(&(menus[m].synclist));
130 gui_syncstatusbar_draw(&statusbars, true); 130 gui_syncstatusbar_draw(&statusbars, true);
131 menu_talk_selected(m); 131 menu_talk_selected(m);
132 while (!exit) { 132 while (!exit) {
133 key = button_get_w_tmo(HZ/2); 133 key = get_action(CONTEXT_MAINMENU,HZ/2);
134 /* 134 /*
135 * "short-circuit" the default keypresses by running the 135 * "short-circuit" the default keypresses by running the
136 * callback function 136 * callback function
@@ -144,40 +144,13 @@ int menu_show(int m)
144 if(gui_synclist_do_button(&(menus[m].synclist), key)) 144 if(gui_synclist_do_button(&(menus[m].synclist), key))
145 menu_talk_selected(m); 145 menu_talk_selected(m);
146 switch( key ) { 146 switch( key ) {
147 case MENU_ENTER | BUTTON_REL: 147 case ACTION_STD_OK:
148 if (lastbutton != MENU_ENTER) 148 action_signalscreenchange();
149 break;
150#ifdef MENU_ENTER2
151 case MENU_ENTER2:
152#endif
153#ifdef MENU_RC_ENTER
154 case MENU_RC_ENTER:
155#endif
156#ifdef MENU_RC_ENTER2
157 case MENU_RC_ENTER2:
158#endif
159 return gui_synclist_get_sel_pos(&(menus[m].synclist)); 149 return gui_synclist_get_sel_pos(&(menus[m].synclist));
160 150
161 151
162 case MENU_EXIT | BUTTON_REL: 152 case ACTION_STD_CANCEL:
163 if (lastbutton != MENU_EXIT) 153 case ACTION_STD_MENU:
164 break;
165#ifdef MENU_EXIT2
166 case MENU_EXIT2:
167#endif
168#ifdef MENU_EXIT_MENU
169 case MENU_EXIT_MENU | BUTTON_REL:
170 /* This is important for the Ondio's */
171 if ((key == (MENU_EXIT_MENU | BUTTON_REL)) &&
172 (lastbutton != MENU_EXIT_MENU))
173 break;
174#endif
175#ifdef MENU_RC_EXIT
176 case MENU_RC_EXIT:
177#endif
178#ifdef MENU_RC_EXIT_MENU
179 case MENU_RC_EXIT_MENU:
180#endif
181 exit = true; 154 exit = true;
182 break; 155 break;
183 156
@@ -187,9 +160,8 @@ int menu_show(int m)
187 break; 160 break;
188 } 161 }
189 gui_syncstatusbar_draw(&statusbars, false); 162 gui_syncstatusbar_draw(&statusbars, false);
190 if ( key )
191 lastbutton = key;
192 } 163 }
164 action_signalscreenchange();
193 return MENU_SELECTED_EXIT; 165 return MENU_SELECTED_EXIT;
194} 166}
195 167
diff --git a/apps/onplay.c b/apps/onplay.c
index a81b096e79..231e658ed9 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -815,11 +815,7 @@ static int onplay_callback(int key, int menu)
815{ 815{
816 (void)menu; 816 (void)menu;
817 817
818 if (key == MENU_EXIT_MENU 818 if (key == ACTION_STD_MENU)
819#ifdef MENU_RC_EXIT_MENU
820 || key == MENU_RC_EXIT_MENU
821#endif
822 )
823 exit_to_main = true; 819 exit_to_main = true;
824 820
825 return key; 821 return key;
diff --git a/apps/playback.h b/apps/playback.h
index 7144974f36..3e501333c1 100644
--- a/apps/playback.h
+++ b/apps/playback.h
@@ -67,9 +67,13 @@ void audio_set_track_unbuffer_event(void (*handler)(struct mp3entry *id3,
67void audio_invalidate_tracks(void); 67void audio_invalidate_tracks(void);
68void voice_init(void); 68void voice_init(void);
69 69
70#if CONFIG_CODEC == SWCODEC /* This #ifdef is better here than gui/gwps.c */
70extern void audio_next_dir(void); 71extern void audio_next_dir(void);
71extern void audio_prev_dir(void); 72extern void audio_prev_dir(void);
72 73#else
74#define audio_next_dir()
75#define audio_prev_dir()
76#endif
73void audio_preinit(void); 77void audio_preinit(void);
74 78
75#endif 79#endif
diff --git a/apps/playlist.c b/apps/playlist.c
index a51e8f501c..aa84bb090f 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -70,6 +70,7 @@
70#include <string.h> 70#include <string.h>
71#include "playlist.h" 71#include "playlist.h"
72#include "file.h" 72#include "file.h"
73#include "action.h"
73#include "dir.h" 74#include "dir.h"
74#include "sprintf.h" 75#include "sprintf.h"
75#include "debug.h" 76#include "debug.h"
@@ -1342,7 +1343,7 @@ static int get_next_dir(char *dir, bool is_forward, bool recursion)
1342 for (i=0; i<num_files; i++) 1343 for (i=0; i<num_files; i++)
1343 { 1344 {
1344 /* user abort */ 1345 /* user abort */
1345 if (button_get(false) == SETTINGS_CANCEL) 1346 if (action_userabort(TIMEOUT_NOBLOCK))
1346 { 1347 {
1347 result = -1; 1348 result = -1;
1348 exit = true; 1349 exit = true;
@@ -1440,7 +1441,7 @@ static int check_subdir_for_music(char *dir, char *subdir)
1440 { 1441 {
1441 for (i=0; i<num_files; i++) 1442 for (i=0; i<num_files; i++)
1442 { 1443 {
1443 if (button_get(false) == SETTINGS_CANCEL) 1444 if (action_userabort(TIMEOUT_NOBLOCK))
1444 { 1445 {
1445 result = -2; 1446 result = -2;
1446 break; 1447 break;
@@ -1888,7 +1889,7 @@ int playlist_resume(void)
1888 str(LANG_OFF_ABORT) 1889 str(LANG_OFF_ABORT)
1889#endif 1890#endif
1890 ); 1891 );
1891 if (SETTINGS_CANCEL == button_get(false)) 1892 if (action_userabort(TIMEOUT_NOBLOCK))
1892 { 1893 {
1893 /* FIXME: 1894 /* FIXME:
1894 * Not sure how to implement this, somebody more familiar 1895 * Not sure how to implement this, somebody more familiar
@@ -2870,7 +2871,7 @@ int playlist_insert_playlist(struct playlist_info* playlist, char *filename,
2870 while ((max = read_line(fd, temp_buf, sizeof(temp_buf))) > 0) 2871 while ((max = read_line(fd, temp_buf, sizeof(temp_buf))) > 0)
2871 { 2872 {
2872 /* user abort */ 2873 /* user abort */
2873 if (button_get(false) == SETTINGS_CANCEL) 2874 if (action_userabort(TIMEOUT_NOBLOCK))
2874 break; 2875 break;
2875 2876
2876 if (temp_buf[0] != '#' && temp_buf[0] != '\0') 2877 if (temp_buf[0] != '#' && temp_buf[0] != '\0')
@@ -3281,7 +3282,7 @@ int playlist_save(struct playlist_info* playlist, char *filename)
3281 int seek; 3282 int seek;
3282 3283
3283 /* user abort */ 3284 /* user abort */
3284 if (button_get(false) == SETTINGS_CANCEL) 3285 if (action_userabort(TIMEOUT_NOBLOCK))
3285 { 3286 {
3286 result = -1; 3287 result = -1;
3287 break; 3288 break;
@@ -3408,7 +3409,7 @@ int playlist_directory_tracksearch(const char* dirname, bool recurse,
3408 for (i=0; i<num_files; i++) 3409 for (i=0; i<num_files; i++)
3409 { 3410 {
3410 /* user abort */ 3411 /* user abort */
3411 if (button_get(false) == SETTINGS_CANCEL) 3412 if (action_userabort(TIMEOUT_NOBLOCK))
3412 { 3413 {
3413 result = -1; 3414 result = -1;
3414 break; 3415 break;
diff --git a/apps/playlist_catalog.c b/apps/playlist_catalog.c
index a1a9bd8ea1..55af178ee4 100644
--- a/apps/playlist_catalog.c
+++ b/apps/playlist_catalog.c
@@ -214,7 +214,6 @@ static int display_playlists(char* playlist, bool view)
214{ 214{
215 int result = -1; 215 int result = -1;
216 int num_playlists = 0; 216 int num_playlists = 0;
217 int lastbutton = BUTTON_NONE;
218 bool exit = false; 217 bool exit = false;
219 char temp_buf[MAX_PATH]; 218 char temp_buf[MAX_PATH];
220 char* playlists[MAX_PLAYLISTS]; 219 char* playlists[MAX_PLAYLISTS];
@@ -240,7 +239,7 @@ static int display_playlists(char* playlist, bool view)
240 239
241 while (!exit) 240 while (!exit)
242 { 241 {
243 int button = button_get_w_tmo(HZ/2); 242 int button = get_action(CONTEXT_LIST,HZ/2);
244 char* sel_file; 243 char* sel_file;
245 244
246 gui_synclist_do_button(&playlist_lists, button); 245 gui_synclist_do_button(&playlist_lists, button);
@@ -249,34 +248,11 @@ static int display_playlists(char* playlist, bool view)
249 248
250 switch (button) 249 switch (button)
251 { 250 {
252 case TREE_EXIT: 251 case ACTION_STD_CANCEL:
253#ifdef TREE_RC_EXIT
254 case TREE_RC_EXIT:
255#endif
256#ifdef TREE_OFF
257 case TREE_OFF:
258#endif
259 exit = true; 252 exit = true;
260 break; 253 break;
261 254
262#ifdef TREE_ENTER 255 case ACTION_STD_OK:
263 case TREE_ENTER:
264 case TREE_ENTER | BUTTON_REPEAT:
265#endif
266#ifdef TREE_RC_RUN
267 case TREE_RC_RUN:
268#endif
269 case TREE_RUN:
270#ifdef TREE_RUN_PRE
271 if (((button == TREE_RUN)
272#ifdef TREE_RC_RUN_PRE
273 || (button == TREE_RC_RUN))
274 && ((lastbutton != TREE_RC_RUN_PRE)
275#endif
276 && (lastbutton != TREE_RUN_PRE)))
277 break;
278#endif
279
280 if (view) 256 if (view)
281 { 257 {
282 /* In view mode, selecting a playlist starts playback */ 258 /* In view mode, selecting a playlist starts playback */
@@ -298,13 +274,7 @@ static int display_playlists(char* playlist, bool view)
298 exit = true; 274 exit = true;
299 break; 275 break;
300 276
301 case TREE_CONTEXT: 277 case ACTION_STD_CONTEXT:
302#ifdef TREE_CONTEXT2
303 case TREE_CONTEXT2:
304#endif
305#ifdef TREE_RC_CONTEXT
306 case TREE_RC_CONTEXT:
307#endif
308 /* context menu only available in view mode */ 278 /* context menu only available in view mode */
309 if (view) 279 if (view)
310 { 280 {
@@ -322,7 +292,7 @@ static int display_playlists(char* playlist, bool view)
322 } 292 }
323 break; 293 break;
324 294
325 case BUTTON_NONE: 295 case ACTION_NONE:
326 gui_syncstatusbar_draw(&statusbars, false); 296 gui_syncstatusbar_draw(&statusbars, false);
327 break; 297 break;
328 298
@@ -334,10 +304,8 @@ static int display_playlists(char* playlist, bool view)
334 } 304 }
335 break; 305 break;
336 } 306 }
337
338 lastbutton = button;
339 } 307 }
340 308 action_signalscreenchange();
341 return result; 309 return result;
342} 310}
343 311
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index 46482cb7fa..7c73b2bad9 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -48,6 +48,7 @@
48#include "statusbar.h" 48#include "statusbar.h"
49#include "splash.h" 49#include "splash.h"
50#include "playlist_menu.h" 50#include "playlist_menu.h"
51#include "action.h"
51 52
52/* Maximum number of tracks we can have loaded at one time */ 53/* Maximum number of tracks we can have loaded at one time */
53#define MAX_PLAYLIST_ENTRIES 200 54#define MAX_PLAYLIST_ENTRIES 200
@@ -614,7 +615,7 @@ bool playlist_viewer_ex(char* filename)
614{ 615{
615 bool ret = false; /* return value */ 616 bool ret = false; /* return value */
616 bool exit=false; /* exit viewer */ 617 bool exit=false; /* exit viewer */
617 int button, lastbutton = BUTTON_NONE; 618 int button;
618 struct gui_synclist playlist_lists; 619 struct gui_synclist playlist_lists;
619 if (!playlist_viewer_init(&viewer, filename, false)) 620 if (!playlist_viewer_init(&viewer, filename, false))
620 goto exit; 621 goto exit;
@@ -661,7 +662,7 @@ bool playlist_viewer_ex(char* filename)
661 } 662 }
662 663
663 /* Timeout so we can determine if play status has changed */ 664 /* Timeout so we can determine if play status has changed */
664 button = button_get_w_tmo(HZ/2); 665 button = get_action(CONTEXT_TREE,HZ/2);
665 int list_action; 666 int list_action;
666 if( (list_action=gui_synclist_do_button(&playlist_lists, button))!=0 ) 667 if( (list_action=gui_synclist_do_button(&playlist_lists, button))!=0 )
667 { 668 {
@@ -669,7 +670,7 @@ bool playlist_viewer_ex(char* filename)
669 if(playlist_buffer_needs_reload(&viewer.buffer, 670 if(playlist_buffer_needs_reload(&viewer.buffer,
670 viewer.selected_track)) 671 viewer.selected_track))
671 playlist_buffer_load_entries_screen(&viewer.buffer, 672 playlist_buffer_load_entries_screen(&viewer.buffer,
672 list_action==LIST_NEXT? 673 list_action==ACTION_STD_NEXT?
673 FORWARD 674 FORWARD
674 : 675 :
675 BACKWARD 676 BACKWARD
@@ -677,36 +678,11 @@ bool playlist_viewer_ex(char* filename)
677 } 678 }
678 switch (button) 679 switch (button)
679 { 680 {
680 case TREE_EXIT | BUTTON_REL: 681 case ACTION_STD_CANCEL:
681 if (lastbutton != TREE_EXIT)
682 break;
683#ifdef TREE_RC_EXIT
684 case TREE_RC_EXIT:
685#endif
686#ifdef TREE_OFF
687 case TREE_OFF:
688#endif
689 exit = true; 682 exit = true;
690 break; 683 break;
691 684 case ACTION_STD_OK:
692#ifdef TREE_ENTER 685 {
693 case TREE_ENTER | BUTTON_REL:
694 if (lastbutton != TREE_ENTER)
695 break;
696#endif
697#ifdef TREE_RC_RUN
698 case TREE_RC_RUN:
699#endif
700 case TREE_RUN:
701#ifdef TREE_RUN_PRE
702 if (((button == TREE_RUN)
703#ifdef TREE_RC_RUN_PRE
704 || (button == TREE_RC_RUN))
705 && ((lastbutton != TREE_RC_RUN_PRE)
706#endif
707 && (lastbutton != TREE_RUN_PRE)))
708 break;
709#endif
710 struct playlist_entry * current_track = 686 struct playlist_entry * current_track =
711 playlist_buffer_get_track(&viewer.buffer, 687 playlist_buffer_get_track(&viewer.buffer,
712 viewer.selected_track); 688 viewer.selected_track);
@@ -744,14 +720,8 @@ bool playlist_viewer_ex(char* filename)
744 gui_synclist_draw(&playlist_lists); 720 gui_synclist_draw(&playlist_lists);
745 721
746 break; 722 break;
747 723 }
748 case TREE_CONTEXT: 724 case ACTION_STD_CONTEXT:
749#ifdef TREE_CONTEXT2
750 case TREE_CONTEXT2:
751#endif
752#ifdef TREE_RC_CONTEXT
753 case TREE_RC_CONTEXT:
754#endif
755 { 725 {
756 /* ON+PLAY menu */ 726 /* ON+PLAY menu */
757 int ret; 727 int ret;
@@ -774,14 +744,7 @@ bool playlist_viewer_ex(char* filename)
774 gui_synclist_draw(&playlist_lists); 744 gui_synclist_draw(&playlist_lists);
775 break; 745 break;
776 } 746 }
777#ifdef TREE_MENU_PRE 747 case ACTION_STD_MENU:
778 case TREE_MENU_PRE:
779#else
780 case TREE_MENU:
781#endif
782#ifdef TREE_RC_MENU
783 case TREE_RC_MENU:
784#endif
785 if (viewer_menu()) 748 if (viewer_menu())
786 { 749 {
787 ret = true; 750 ret = true;
@@ -795,7 +758,7 @@ bool playlist_viewer_ex(char* filename)
795 gui_synclist_draw(&playlist_lists); 758 gui_synclist_draw(&playlist_lists);
796 break; 759 break;
797 760
798 case BUTTON_NONE: 761 case ACTION_NONE:
799 gui_syncstatusbar_draw(&statusbars, false); 762 gui_syncstatusbar_draw(&statusbars, false);
800 break; 763 break;
801 764
@@ -807,12 +770,12 @@ bool playlist_viewer_ex(char* filename)
807 } 770 }
808 break; 771 break;
809 } 772 }
810 lastbutton = button;
811 } 773 }
812 774
813exit: 775exit:
814 if (viewer.playlist) 776 if (viewer.playlist)
815 playlist_close(viewer.playlist); 777 playlist_close(viewer.playlist);
778 action_signalscreenchange();
816 return ret; 779 return ret;
817} 780}
818char * playlist_search_callback_name(int selected_item, void * data, char *buffer) 781char * playlist_search_callback_name(int selected_item, void * data, char *buffer)
@@ -860,7 +823,7 @@ bool search_playlist(void)
860 str(LANG_OFF_ABORT) 823 str(LANG_OFF_ABORT)
861#endif 824#endif
862 ); 825 );
863 if (SETTINGS_CANCEL == button_get(false)) 826 if (action_userabort(TIMEOUT_NOBLOCK))
864 return ret; 827 return ret;
865 playlist_get_track_info(viewer.playlist,i,&track); 828 playlist_get_track_info(viewer.playlist,i,&track);
866 if (strcasestr(track.filename,search_str)) 829 if (strcasestr(track.filename,search_str))
@@ -883,35 +846,22 @@ bool search_playlist(void)
883 gui_synclist_draw(&playlist_lists); 846 gui_synclist_draw(&playlist_lists);
884 while (!exit) 847 while (!exit)
885 { 848 {
886 button = button_get(true); 849 button = get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
887 if (gui_synclist_do_button(&playlist_lists, button)) 850 if (gui_synclist_do_button(&playlist_lists, button))
888 continue; 851 continue;
889 switch (button) 852 switch (button)
890 { 853 {
891 case TREE_EXIT: 854 case ACTION_STD_CANCEL:
892#ifdef TREE_RC_EXIT
893 case TREE_RC_EXIT:
894#endif
895#ifdef TREE_OFF
896 case TREE_OFF:
897#endif
898 exit = true; 855 exit = true;
899 break; 856 break;
900 857
901#ifdef TREE_ENTER 858 case ACTION_STD_OK:
902 case TREE_ENTER:
903 case TREE_ENTER | BUTTON_REPEAT:
904#endif
905#ifdef TREE_RC_RUN
906 case TREE_RC_RUN:
907#endif
908 case TREE_RUN:
909 playlist_start( 859 playlist_start(
910 found_indicies[gui_synclist_get_sel_pos(&playlist_lists)] 860 found_indicies[gui_synclist_get_sel_pos(&playlist_lists)]
911 ,0); 861 ,0);
912 exit = 1; 862 exit = 1;
913 break; 863 break;
914 case BUTTON_NONE: 864 case ACTION_NONE:
915 break; 865 break;
916 default: 866 default:
917 if(default_event_handler(button) == SYS_USB_CONNECTED) 867 if(default_event_handler(button) == SYS_USB_CONNECTED)
@@ -922,6 +872,7 @@ bool search_playlist(void)
922 break; 872 break;
923 } 873 }
924 } 874 }
875 action_signalscreenchange();
925 return ret; 876 return ret;
926} 877}
927 878
diff --git a/apps/plugin.c b/apps/plugin.c
index c9278c8897..ea200b84ad 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -468,6 +468,11 @@ static const struct plugin_api rockbox_api = {
468#endif 468#endif
469 469
470 PREFIX(rmdir), 470 PREFIX(rmdir),
471 /* action handling */
472 get_custom_action,
473 get_action,
474 action_signalscreenchange,
475 action_userabort,
471}; 476};
472 477
473int plugin_load(const char* plugin, void* parameter) 478int plugin_load(const char* plugin, void* parameter)
diff --git a/apps/plugin.h b/apps/plugin.h
index 505e7ec666..8384d8b9aa 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -38,6 +38,7 @@
38#include "dir.h" 38#include "dir.h"
39#include "kernel.h" 39#include "kernel.h"
40#include "button.h" 40#include "button.h"
41#include "action.h"
41#include "usb.h" 42#include "usb.h"
42#include "font.h" 43#include "font.h"
43#include "system.h" 44#include "system.h"
@@ -104,7 +105,7 @@
104#define PLUGIN_MAGIC 0x526F634B /* RocK */ 105#define PLUGIN_MAGIC 0x526F634B /* RocK */
105 106
106/* increase this every time the api struct changes */ 107/* increase this every time the api struct changes */
107#define PLUGIN_API_VERSION 28 108#define PLUGIN_API_VERSION 29
108 109
109/* update this to latest version if a change to the api struct breaks 110/* update this to latest version if a change to the api struct breaks
110 backwards compatibility (and please take the opportunity to sort in any 111 backwards compatibility (and please take the opportunity to sort in any
@@ -546,6 +547,12 @@ struct plugin_api {
546#endif 547#endif
547 548
548 int (*PREFIX(rmdir))(const char *name); 549 int (*PREFIX(rmdir))(const char *name);
550 /* action handling */
551 int (*get_custom_action)(int context,int timeout,
552 struct button_mapping* (*get_context_map)(int));
553 int (*get_action)(int context, int timeout);
554 void (*action_signalscreenchange)(void);
555 bool (*action_userabort)(int timeout);
549}; 556};
550 557
551/* plugin header */ 558/* plugin header */
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 1d39fefd21..c292909b33 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -1359,6 +1359,7 @@ bool handle_radio_presets_menu(void)
1359int handle_radio_presets_cb(int key, int m) 1359int handle_radio_presets_cb(int key, int m)
1360{ 1360{
1361 (void)m; 1361 (void)m;
1362#if 0 /* this screen needs fixing! */
1362 switch(key) 1363 switch(key)
1363 { 1364 {
1364#ifdef FM_PRESET_ADD 1365#ifdef FM_PRESET_ADD
@@ -1372,7 +1373,7 @@ int handle_radio_presets_cb(int key, int m)
1372#ifdef FM_PRESET 1373#ifdef FM_PRESET
1373 case FM_PRESET: 1374 case FM_PRESET:
1374 menu_draw(m); 1375 menu_draw(m);
1375 key = MENU_EXIT; /* Fake an exit */ 1376 key = ACTION_STD_EXIT; /* Fake an exit */
1376 break; 1377 break;
1377#endif 1378#endif
1378#endif 1379#endif
@@ -1409,21 +1410,11 @@ int handle_radio_presets_cb(int key, int m)
1409 case MENU_ENTER2 | BUTTON_REL: 1410 case MENU_ENTER2 | BUTTON_REL:
1410#endif 1411#endif
1411 case MENU_ENTER | BUTTON_REL: 1412 case MENU_ENTER | BUTTON_REL:
1412 key = MENU_ENTER; /* fake enter for short press */ 1413 key = ACTION_STD_SELECT; /* fake enter for short press */
1413 break; 1414 break;
1414 1415
1415/* ignore down events */ 1416/* ignore down events */
1416#ifdef MENU_RC_ENTER 1417 case ACTION_STD_SELECT:
1417 case MENU_RC_ENTER:
1418#endif
1419#ifdef MENU_RC_ENTER2
1420 case MENU_RC_ENTER2:
1421#endif
1422
1423#ifdef MENU_ENTER2
1424 case MENU_ENTER2:
1425#endif
1426 case MENU_ENTER:
1427 /* Ignore the release events */ 1418 /* Ignore the release events */
1428#ifdef FM_PRESET_ADD 1419#ifdef FM_PRESET_ADD
1429 case FM_PRESET_ADD | BUTTON_REL: 1420 case FM_PRESET_ADD | BUTTON_REL:
@@ -1434,6 +1425,7 @@ int handle_radio_presets_cb(int key, int m)
1434 key = BUTTON_NONE; 1425 key = BUTTON_NONE;
1435 break; 1426 break;
1436 } 1427 }
1428#endif
1437 return key; 1429 return key;
1438} 1430}
1439 1431
@@ -1611,6 +1603,7 @@ static bool scan_presets(void)
1611int radio_menu_cb(int key, int m) 1603int radio_menu_cb(int key, int m)
1612{ 1604{
1613 (void)m; 1605 (void)m;
1606#if 0 /* this screen needs fixing! */
1614 switch(key) 1607 switch(key)
1615 { 1608 {
1616#if (CONFIG_KEYPAD != IRIVER_H100_PAD) && (CONFIG_KEYPAD != IRIVER_H300_PAD) && (CONFIG_KEYPAD != IAUDIO_X5_PAD) 1609#if (CONFIG_KEYPAD != IRIVER_H100_PAD) && (CONFIG_KEYPAD != IRIVER_H300_PAD) && (CONFIG_KEYPAD != IAUDIO_X5_PAD)
@@ -1631,7 +1624,7 @@ int radio_menu_cb(int key, int m)
1631 key = MENU_ENTER; /* fake downpress, next menu doesn't like release */ 1624 key = MENU_ENTER; /* fake downpress, next menu doesn't like release */
1632 break; 1625 break;
1633 } 1626 }
1634 1627#endif
1635 return key; 1628 return key;
1636} 1629}
1637 1630
diff --git a/apps/screens.c b/apps/screens.c
index 5a2b58e853..6d9f79e6a5 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -21,7 +21,7 @@
21#include <string.h> 21#include <string.h>
22#include <stdio.h> 22#include <stdio.h>
23#include "backlight.h" 23#include "backlight.h"
24#include "button.h" 24#include "action.h"
25#include "lcd.h" 25#include "lcd.h"
26#include "lang.h" 26#include "lang.h"
27#include "icons.h" 27#include "icons.h"
@@ -309,11 +309,7 @@ void charging_display_info(bool animate)
309 2 if Off/Stop key was pressed 309 2 if Off/Stop key was pressed
310 3 if On key was pressed 310 3 if On key was pressed
311 4 if USB was connected */ 311 4 if USB was connected */
312#if (CONFIG_KEYPAD==IPOD_3G_PAD) || (CONFIG_KEYPAD==IPOD_4G_PAD) 312
313# define CHARGE_SCREEN_RESUME BUTTON_SELECT
314#else
315# define CHARGE_SCREEN_RESUME BUTTON_ON
316#endif
317int charging_screen(void) 313int charging_screen(void)
318{ 314{
319 unsigned int button; 315 unsigned int button;
@@ -338,8 +334,8 @@ int charging_screen(void)
338 { 334 {
339 gui_syncstatusbar_draw(&statusbars, false); 335 gui_syncstatusbar_draw(&statusbars, false);
340 charging_display_info(true); 336 charging_display_info(true);
341 button = button_get_w_tmo(HZ/3); 337 button = get_action(CONTEXT_STD,HZ/3);
342 if (button == CHARGE_SCREEN_RESUME) 338 if (button == ACTION_STD_OK)
343 rc = 2; 339 rc = 2;
344 else if (usb_detect()) 340 else if (usb_detect())
345 rc = 3; 341 rc = 3;
@@ -350,6 +346,7 @@ int charging_screen(void)
350#ifdef HAVE_LCD_CHARCELLS 346#ifdef HAVE_LCD_CHARCELLS
351 logo_lock_patterns(false); 347 logo_lock_patterns(false);
352#endif 348#endif
349 action_signalscreenchange();
353 return rc; 350 return rc;
354} 351}
355#endif /* CONFIG_CHARGING && !HAVE_POWEROFF_WHILE_CHARGING */ 352#endif /* CONFIG_CHARGING && !HAVE_POWEROFF_WHILE_CHARGING */
@@ -423,15 +420,15 @@ bool pitch_screen(void)
423 { 420 {
424 pitch_screen_draw(pitch); 421 pitch_screen_draw(pitch);
425 422
426 button = button_get(true); 423 button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
427 switch (button) { 424 switch (button) {
428 case PITCH_UP: 425 case ACTION_SETTINGS_INC:
429 if ( pitch < 2000 ) 426 if ( pitch < 2000 )
430 pitch++; 427 pitch++;
431 sound_set_pitch(pitch); 428 sound_set_pitch(pitch);
432 break; 429 break;
433 430
434 case PITCH_UP | BUTTON_REPEAT: 431 case ACTION_SETTINGS_INCREPEAT:
435 if ( pitch < 1990 ) 432 if ( pitch < 1990 )
436 pitch += 10; 433 pitch += 10;
437 else 434 else
@@ -439,13 +436,13 @@ bool pitch_screen(void)
439 sound_set_pitch(pitch); 436 sound_set_pitch(pitch);
440 break; 437 break;
441 438
442 case PITCH_DOWN: 439 case ACTION_SETTINGS_DEC:
443 if ( pitch > 500 ) 440 if ( pitch > 500 )
444 pitch--; 441 pitch--;
445 sound_set_pitch(pitch); 442 sound_set_pitch(pitch);
446 break; 443 break;
447 444
448 case PITCH_DOWN | BUTTON_REPEAT: 445 case ACTION_SETTINGS_DECREPEAT:
449 if ( pitch > 510 ) 446 if ( pitch > 510 )
450 pitch -= 10; 447 pitch -= 10;
451 else 448 else
@@ -453,7 +450,7 @@ bool pitch_screen(void)
453 sound_set_pitch(pitch); 450 sound_set_pitch(pitch);
454 break; 451 break;
455 452
456 case PITCH_RIGHT: 453 case ACTION_STD_NEXT:
457 if ( pitch < 1980 ) 454 if ( pitch < 1980 )
458 { 455 {
459 pitch += 20; 456 pitch += 20;
@@ -461,15 +458,12 @@ bool pitch_screen(void)
461 458
462 pitch_screen_draw(pitch); 459 pitch_screen_draw(pitch);
463 460
464 while(button != (PITCH_RIGHT|BUTTON_REL))
465 button = button_get(true);
466
467 pitch -= 20; 461 pitch -= 20;
468 sound_set_pitch(pitch); 462 sound_set_pitch(pitch);
469 } 463 }
470 break; 464 break;
471 465
472 case PITCH_LEFT: 466 case ACTION_STD_PREV:
473 if ( pitch > 520 ) 467 if ( pitch > 520 )
474 { 468 {
475 pitch -= 20; 469 pitch -= 20;
@@ -477,20 +471,17 @@ bool pitch_screen(void)
477 471
478 pitch_screen_draw(pitch); 472 pitch_screen_draw(pitch);
479 473
480 while(button != (PITCH_LEFT|BUTTON_REL))
481 button = button_get(true);;
482
483 pitch += 20; 474 pitch += 20;
484 sound_set_pitch(pitch); 475 sound_set_pitch(pitch);
485 } 476 }
486 break; 477 break;
487 478
488 case PITCH_RESET: 479 case ACTION_STD_OK:
489 pitch = 1000; 480 pitch = 1000;
490 sound_set_pitch( pitch ); 481 sound_set_pitch( pitch );
491 break; 482 break;
492 483
493 case PITCH_EXIT: 484 case ACTION_STD_CANCEL:
494 exit = true; 485 exit = true;
495 break; 486 break;
496 487
@@ -504,6 +495,7 @@ bool pitch_screen(void)
504 pcmbuf_set_low_latency(false); 495 pcmbuf_set_low_latency(false);
505#endif 496#endif
506 lcd_setfont(FONT_UI); 497 lcd_setfont(FONT_UI);
498 action_signalscreenchange();
507 return 0; 499 return 0;
508} 500}
509#endif 501#endif
@@ -923,24 +915,22 @@ bool set_time_screen(const char* string, struct tm *tm)
923 say_time(cursorpos, tm); 915 say_time(cursorpos, tm);
924 } 916 }
925 917
926 button = button_get_w_tmo(HZ/2); 918 button = get_action(CONTEXT_SETTINGS,HZ/2);
927 switch ( button ) { 919 switch ( button ) {
928 case SETTINGS_PREV: 920 case ACTION_STD_PREV:
929 cursorpos = (cursorpos + 6 - 1) % 6; 921 cursorpos = (cursorpos + 6 - 1) % 6;
930 break; 922 break;
931 case SETTINGS_NEXT: 923 case ACTION_STD_NEXT:
932 cursorpos = (cursorpos + 6 + 1) % 6; 924 cursorpos = (cursorpos + 6 + 1) % 6;
933 break; 925 break;
934 case SETTINGS_INC: 926 case ACTION_SETTINGS_INC:
935 case SETTINGS_INC | BUTTON_REPEAT:
936 *valptr = (*valptr + steps - min + 1) % 927 *valptr = (*valptr + steps - min + 1) %
937 steps + min; 928 steps + min;
938 if(*valptr == 0) 929 if(*valptr == 0)
939 *valptr = min; 930 *valptr = min;
940 say_time(cursorpos, tm); 931 say_time(cursorpos, tm);
941 break; 932 break;
942 case SETTINGS_DEC: 933 case ACTION_SETTINGS_DEC:
943 case SETTINGS_DEC | BUTTON_REPEAT:
944 *valptr = (*valptr + steps - min - 1) % 934 *valptr = (*valptr + steps - min - 1) %
945 steps + min; 935 steps + min;
946 if(*valptr == 0) 936 if(*valptr == 0)
@@ -948,11 +938,11 @@ bool set_time_screen(const char* string, struct tm *tm)
948 say_time(cursorpos, tm); 938 say_time(cursorpos, tm);
949 break; 939 break;
950 940
951 case SETTINGS_ACCEPT: 941 case ACTION_STD_OK:
952 done = true; 942 done = true;
953 break; 943 break;
954 944
955 case SETTINGS_CANCEL: 945 case ACTION_STD_CANCEL:
956 done = true; 946 done = true;
957 tm->tm_year = -1; 947 tm->tm_year = -1;
958 break; 948 break;
@@ -963,7 +953,7 @@ bool set_time_screen(const char* string, struct tm *tm)
963 break; 953 break;
964 } 954 }
965 } 955 }
966 956 action_signalscreenchange();
967 lcd_set_drawmode(lastmode); 957 lcd_set_drawmode(lastmode);
968 return false; 958 return false;
969} 959}
@@ -981,10 +971,10 @@ bool shutdown_screen(void)
981 971
982 while(!done) 972 while(!done)
983 { 973 {
984 button = button_get_w_tmo(HZ*2); 974 button = get_action(CONTEXT_STD,HZ*2);
985 switch(button) 975 switch(button)
986 { 976 {
987 case BUTTON_OFF: 977 case ACTION_STD_CANCEL:
988 sys_poweroff(); 978 sys_poweroff();
989 break; 979 break;
990 980
@@ -998,11 +988,14 @@ bool shutdown_screen(void)
998 not have released the button yet. 988 not have released the button yet.
999 We also ignore REPEAT events, since we don't want to 989 We also ignore REPEAT events, since we don't want to
1000 remove the splash when the user holds OFF to shut down. */ 990 remove the splash when the user holds OFF to shut down. */
991 /* Is this still needed? commenting out so it compiles..
992 CHECK ME!!
1001 if(!(button & (BUTTON_REL | BUTTON_REPEAT))) 993 if(!(button & (BUTTON_REL | BUTTON_REPEAT)))
1002 done = true; 994 */ done = true;
1003 break; 995 break;
1004 } 996 }
1005 } 997 }
998 action_signalscreenchange();
1006 return false; 999 return false;
1007} 1000}
1008#endif 1001#endif
@@ -1123,9 +1116,12 @@ bool browse_id3(void)
1123 gui_synclist_set_nb_items(&id3_lists, ID3_ITEMS*2); 1116 gui_synclist_set_nb_items(&id3_lists, ID3_ITEMS*2);
1124 gui_synclist_draw(&id3_lists); 1117 gui_synclist_draw(&id3_lists);
1125 while (true) { 1118 while (true) {
1126 key = button_get_w_tmo(HZ/2); 1119 key = get_action(CONTEXT_STD,HZ/2);
1127 if(key!=BUTTON_NONE && !(key&BUTTON_REL) && !gui_synclist_do_button(&id3_lists, key)) 1120 if(key!=ACTION_NONE && /* !(key&BUTTON_REL) && ?? */ !gui_synclist_do_button(&id3_lists, key))
1121 {
1122 action_signalscreenchange();
1128 return(default_event_handler(key) == SYS_USB_CONNECTED); 1123 return(default_event_handler(key) == SYS_USB_CONNECTED);
1124 }
1129 gui_syncstatusbar_draw(&statusbars, false); 1125 gui_syncstatusbar_draw(&statusbars, false);
1130 } 1126 }
1131} 1127}
@@ -1147,29 +1143,24 @@ bool set_rating(void)
1147 snprintf(rating_text, sizeof(rating_text), "%d", id3->rating); 1143 snprintf(rating_text, sizeof(rating_text), "%d", id3->rating);
1148 lcd_puts(0, 1, (unsigned char *)rating_text); 1144 lcd_puts(0, 1, (unsigned char *)rating_text);
1149 lcd_update(); 1145 lcd_update();
1150 button = button_get(true); 1146 button = get_action(CONTEXT_SETTINGS,TIMEOUT_BLOCK);
1151 1147
1152 switch(button) 1148 switch(button)
1153 { 1149 {
1154 case SETTINGS_DEC: 1150 case ACTION_SETTINGS_DEC:
1155 if (id3->rating > 0) 1151 if (id3->rating > 0)
1156 id3->rating--; 1152 id3->rating--;
1157 else 1153 else
1158 id3->rating = 10; 1154 id3->rating = 10;
1159 break; 1155 break;
1160 1156
1161 case SETTINGS_INC: 1157 case ACTION_SETTINGS_INC:
1162 if (id3->rating < 10) 1158 if (id3->rating < 10)
1163 id3->rating++; 1159 id3->rating++;
1164 else 1160 else
1165 id3->rating = 0; 1161 id3->rating = 0;
1166 break; 1162 break;
1167 case SETTINGS_CANCEL: 1163 case ACTION_STD_CANCEL:
1168#ifdef SETTINGS_OK2
1169 case SETTINGS_OK2:
1170#endif
1171 /* eat release event */
1172 button_get(true);
1173 exit = true; 1164 exit = true;
1174 break; 1165 break;
1175 1166
@@ -1179,5 +1170,6 @@ bool set_rating(void)
1179 break; 1170 break;
1180 } 1171 }
1181 } 1172 }
1173 action_signalscreenchange();
1182 return false; 1174 return false;
1183} 1175}
diff --git a/apps/screens.h b/apps/screens.h
index 34e7c9f603..deece8784d 100644
--- a/apps/screens.h
+++ b/apps/screens.h
@@ -22,51 +22,6 @@
22#include "config.h" 22#include "config.h"
23#include "timefuncs.h" 23#include "timefuncs.h"
24 24
25#if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == IRIVER_H100_PAD) ||\
26 (CONFIG_KEYPAD == IRIVER_H300_PAD)
27#define PITCH_UP BUTTON_UP
28#define PITCH_DOWN BUTTON_DOWN
29#define PITCH_RIGHT BUTTON_RIGHT
30#define PITCH_LEFT BUTTON_LEFT
31#define PITCH_EXIT BUTTON_OFF
32#define PITCH_RESET BUTTON_ON
33#elif (CONFIG_KEYPAD == ONDIO_PAD)
34#define PITCH_UP BUTTON_UP
35#define PITCH_DOWN BUTTON_DOWN
36#define PITCH_RIGHT BUTTON_RIGHT
37#define PITCH_LEFT BUTTON_LEFT
38#define PITCH_EXIT BUTTON_OFF
39#define PITCH_RESET BUTTON_MENU
40#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
41#define PITCH_UP BUTTON_SCROLL_FWD
42#define PITCH_DOWN BUTTON_SCROLL_BACK
43#define PITCH_RIGHT BUTTON_RIGHT
44#define PITCH_LEFT BUTTON_LEFT
45#define PITCH_EXIT BUTTON_SELECT
46#define PITCH_RESET BUTTON_MENU
47#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
48#define PITCH_UP BUTTON_UP
49#define PITCH_DOWN BUTTON_DOWN
50#define PITCH_RIGHT BUTTON_RIGHT
51#define PITCH_LEFT BUTTON_LEFT
52#define PITCH_EXIT BUTTON_SELECT
53#define PITCH_RESET BUTTON_A
54#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
55#define PITCH_UP BUTTON_UP
56#define PITCH_DOWN BUTTON_DOWN
57#define PITCH_RIGHT BUTTON_RIGHT
58#define PITCH_LEFT BUTTON_LEFT
59#define PITCH_EXIT BUTTON_PLAY
60#define PITCH_RESET BUTTON_POWER
61#elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
62#define PITCH_UP BUTTON_SCROLL_UP
63#define PITCH_DOWN BUTTON_SCROLL_DOWN
64#define PITCH_RIGHT BUTTON_RIGHT
65#define PITCH_LEFT BUTTON_LEFT
66#define PITCH_EXIT BUTTON_PLAY
67#define PITCH_RESET BUTTON_POWER
68#endif
69
70struct screen; 25struct screen;
71 26
72void usb_display_info(struct screen * display); 27void usb_display_info(struct screen * display);
diff --git a/apps/settings.c b/apps/settings.c
index 412fc4bfed..f70e29696b 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -24,7 +24,7 @@
24#include "config.h" 24#include "config.h"
25#include "kernel.h" 25#include "kernel.h"
26#include "thread.h" 26#include "thread.h"
27#include "button.h" 27#include "action.h"
28#include "settings.h" 28#include "settings.h"
29#include "disk.h" 29#include "disk.h"
30#include "panic.h" 30#include "panic.h"
@@ -612,6 +612,7 @@ static const struct bit_entry hd_bits[] =
612 {2, S_O(eq_hw_band4_cutoff), 1, "eq hardware band 4 cutoff", "5.3kHz,6.9kHz,9kHz,11.7kHz" }, 612 {2, S_O(eq_hw_band4_cutoff), 1, "eq hardware band 4 cutoff", "5.3kHz,6.9kHz,9kHz,11.7kHz" },
613 {5|SIGNED, S_O(eq_hw_band4_gain), 12, "eq hardware band 4 gain", NULL }, 613 {5|SIGNED, S_O(eq_hw_band4_gain), 12, "eq hardware band 4 gain", NULL },
614#endif 614#endif
615 {1, S_O(hold_lr_for_scroll_in_list), true, "hold_lr_for_scroll_in_list", off_on },
615 616
616 {2, S_O(show_path_in_browser), 0, "show path in browser", "off,current directory,full path" }, 617 {2, S_O(show_path_in_browser), 0, "show path in browser", "off,current directory,full path" },
617 618
@@ -1799,7 +1800,7 @@ void settings_reset(void) {
1799#ifdef HAVE_LCD_BITMAP 1800#ifdef HAVE_LCD_BITMAP
1800 global_settings.kbd_file[0] = '\0'; 1801 global_settings.kbd_file[0] = '\0';
1801#endif 1802#endif
1802 1803 global_settings.hold_lr_for_scroll_in_list = true;
1803} 1804}
1804 1805
1805bool set_bool(const char* string, bool* variable ) 1806bool set_bool(const char* string, bool* variable )
@@ -1891,7 +1892,7 @@ bool do_set_setting(const unsigned char* string, void *variable,
1891 struct value_setting_data *cb_data, 1892 struct value_setting_data *cb_data,
1892 void (*function)(int)) 1893 void (*function)(int))
1893{ 1894{
1894 int button; 1895 int action;
1895 bool done = false; 1896 bool done = false;
1896 struct gui_synclist lists; 1897 struct gui_synclist lists;
1897 int oldvalue; 1898 int oldvalue;
@@ -1918,11 +1919,11 @@ bool do_set_setting(const unsigned char* string, void *variable,
1918 while (!done) 1919 while (!done)
1919 { 1920 {
1920 1921
1921 button = button_get(true); 1922 action = get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
1922 if (button == BUTTON_NONE) 1923 if (action == ACTION_NONE)
1923 continue; 1924 continue;
1924 1925
1925 if (gui_synclist_do_button(&lists,button)) 1926 if (gui_synclist_do_button(&lists,action))
1926 { 1927 {
1927 if (global_settings.talk_menu) 1928 if (global_settings.talk_menu)
1928 { 1929 {
@@ -1946,7 +1947,7 @@ bool do_set_setting(const unsigned char* string, void *variable,
1946 *(bool*)variable = gui_synclist_get_sel_pos(&lists) ? true : false; 1947 *(bool*)variable = gui_synclist_get_sel_pos(&lists) ? true : false;
1947 else *(int*)variable = gui_synclist_get_sel_pos(&lists); 1948 else *(int*)variable = gui_synclist_get_sel_pos(&lists);
1948 } 1949 }
1949 else if (button == SETTINGS_CANCEL) 1950 else if (action == ACTION_STD_CANCEL)
1950 { 1951 {
1951 gui_syncsplash(HZ/2,true,str(LANG_MENU_SETTING_CANCEL)); 1952 gui_syncsplash(HZ/2,true,str(LANG_MENU_SETTING_CANCEL));
1952 if (cb_data->type == INT) 1953 if (cb_data->type == INT)
@@ -1954,11 +1955,11 @@ bool do_set_setting(const unsigned char* string, void *variable,
1954 else *(bool*)variable = (bool)oldvalue; 1955 else *(bool*)variable = (bool)oldvalue;
1955 done = true; 1956 done = true;
1956 } 1957 }
1957 else if (button == SETTINGS_OK) 1958 else if (action == ACTION_STD_OK)
1958 { 1959 {
1959 done = true; 1960 done = true;
1960 } 1961 }
1961 else if(default_event_handler(button) == SYS_USB_CONNECTED) 1962 else if(default_event_handler(action) == SYS_USB_CONNECTED)
1962 return true; 1963 return true;
1963 gui_syncstatusbar_draw(&statusbars, false); 1964 gui_syncstatusbar_draw(&statusbars, false);
1964 if ( function ) 1965 if ( function )
diff --git a/apps/settings.h b/apps/settings.h
index 439a43809a..27f00584a6 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -45,115 +45,6 @@
45 45
46#define MAX_FILENAME 20 46#define MAX_FILENAME 20
47 47
48/* button definitions */
49#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
50 (CONFIG_KEYPAD == IRIVER_H300_PAD)
51#define SETTINGS_INC BUTTON_UP
52#define SETTINGS_DEC BUTTON_DOWN
53#define SETTINGS_OK BUTTON_SELECT
54#define SETTINGS_OK2 BUTTON_LEFT
55#define SETTINGS_CANCEL BUTTON_OFF
56#define SETTINGS_CANCEL2 BUTTON_MODE
57#define SETTINGS_PREV BUTTON_LEFT
58#define SETTINGS_NEXT BUTTON_RIGHT
59#define SETTINGS_ACCEPT BUTTON_ON
60
61#define SETTINGS_RC_INC BUTTON_RC_FF
62#define SETTINGS_RC_DEC BUTTON_RC_REW
63#define SETTINGS_RC_OK BUTTON_RC_MENU
64#define SETTINGS_RC_OK2 BUTTON_RC_SOURCE
65#define SETTINGS_RC_CANCEL BUTTON_RC_STOP
66#define SETTINGS_RC_CANCEL2 BUTTON_RC_MODE
67#define SETTINGS_RC_PREV BUTTON_RC_SOURCE
68#define SETTINGS_RC_NEXT BUTTON_RC_BITRATE
69#define SETTINGS_RC_ACCEPT BUTTON_RC_ON
70
71#elif CONFIG_KEYPAD == RECORDER_PAD
72#define SETTINGS_INC BUTTON_UP
73#define SETTINGS_DEC BUTTON_DOWN
74#define SETTINGS_OK BUTTON_PLAY
75#define SETTINGS_OK2 BUTTON_LEFT
76#define SETTINGS_CANCEL BUTTON_OFF
77#define SETTINGS_CANCEL2 BUTTON_F1
78#define SETTINGS_PREV BUTTON_LEFT
79#define SETTINGS_NEXT BUTTON_RIGHT
80#define SETTINGS_ACCEPT BUTTON_ON
81
82#elif CONFIG_KEYPAD == PLAYER_PAD
83#define SETTINGS_INC BUTTON_RIGHT
84#define SETTINGS_DEC BUTTON_LEFT
85#define SETTINGS_OK BUTTON_PLAY
86#define SETTINGS_CANCEL BUTTON_STOP
87#define SETTINGS_CANCEL2 BUTTON_MENU
88#define SETTINGS_ACCEPT BUTTON_ON
89
90#elif CONFIG_KEYPAD == ONDIO_PAD
91#define SETTINGS_INC BUTTON_UP
92#define SETTINGS_DEC BUTTON_DOWN
93#define SETTINGS_OK BUTTON_RIGHT
94#define SETTINGS_OK2 BUTTON_LEFT
95#define SETTINGS_CANCEL BUTTON_MENU
96#define SETTINGS_CANCEL2 BUTTON_OFF
97
98#elif CONFIG_KEYPAD == GMINI100_PAD
99#define SETTINGS_INC BUTTON_UP
100#define SETTINGS_DEC BUTTON_DOWN
101#define SETTINGS_OK BUTTON_PLAY
102#define SETTINGS_OK2 BUTTON_LEFT
103#define SETTINGS_CANCEL BUTTON_OFF
104#define SETTINGS_CANCEL2 BUTTON_MENU
105#define SETTINGS_PREV BUTTON_LEFT
106#define SETTINGS_NEXT BUTTON_RIGHT
107#define SETTINGS_ACCEPT BUTTON_MENU
108
109#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
110#define SETTINGS_INC BUTTON_SCROLL_FWD
111#define SETTINGS_DEC BUTTON_SCROLL_BACK
112#define SETTINGS_OK BUTTON_SELECT
113#define SETTINGS_CANCEL BUTTON_MENU
114#define SETTINGS_PREV BUTTON_LEFT
115#define SETTINGS_NEXT BUTTON_RIGHT
116#define SETTINGS_ACCEPT BUTTON_PLAY
117
118#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
119#define SETTINGS_INC BUTTON_UP
120#define SETTINGS_DEC BUTTON_DOWN
121#define SETTINGS_OK BUTTON_SELECT
122#define SETTINGS_CANCEL BUTTON_PLAY
123#define SETTINGS_PREV BUTTON_LEFT
124#define SETTINGS_NEXT BUTTON_RIGHT
125
126#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
127#define SETTINGS_INC BUTTON_UP
128#define SETTINGS_DEC BUTTON_DOWN
129#define SETTINGS_OK BUTTON_SELECT
130#define SETTINGS_OK2 BUTTON_LEFT
131#define SETTINGS_CANCEL BUTTON_REC
132#define SETTINGS_PREV BUTTON_LEFT
133#define SETTINGS_NEXT BUTTON_RIGHT
134#define SETTINGS_ACCEPT BUTTON_PLAY
135
136#elif CONFIG_KEYPAD == GIGABEAT_PAD
137#define SETTINGS_INC BUTTON_UP
138#define SETTINGS_DEC BUTTON_DOWN
139#define SETTINGS_OK BUTTON_MENU
140#define SETTINGS_CANCEL BUTTON_A
141#define SETTINGS_PREV BUTTON_LEFT
142#define SETTINGS_NEXT BUTTON_RIGHT
143#define SETTINGS_ACCEPT BUTTON_SELECT
144
145#elif CONFIG_KEYPAD == IRIVER_H10_PAD
146#define SETTINGS_INC BUTTON_SCROLL_UP
147#define SETTINGS_DEC BUTTON_SCROLL_DOWN
148#define SETTINGS_OK BUTTON_PLAY
149#define SETTINGS_OK2 BUTTON_LEFT
150#define SETTINGS_CANCEL BUTTON_REW
151#define SETTINGS_PREV BUTTON_LEFT
152#define SETTINGS_NEXT BUTTON_RIGHT
153#define SETTINGS_ACCEPT BUTTON_FF
154
155#endif
156
157/* data structures */ 48/* data structures */
158 49
159#define BOOKMARK_NO 0 50#define BOOKMARK_NO 0
@@ -564,7 +455,7 @@ struct user_settings
564 int eq_hw_band4_cutoff; 455 int eq_hw_band4_cutoff;
565 int eq_hw_band4_gain; 456 int eq_hw_band4_gain;
566#endif 457#endif
567 458 bool hold_lr_for_scroll_in_list; /* hold L/R scrolls the list left/right */
568 int show_path_in_browser; /* 0=off, 1=current directory, 2=full path */ 459 int show_path_in_browser; /* 0=off, 1=current directory, 2=full path */
569}; 460};
570 461
diff --git a/apps/tagtree.c b/apps/tagtree.c
index 0727b8ea45..405a1bbf34 100644
--- a/apps/tagtree.c
+++ b/apps/tagtree.c
@@ -29,6 +29,7 @@
29#include "splash.h" 29#include "splash.h"
30#include "icons.h" 30#include "icons.h"
31#include "tree.h" 31#include "tree.h"
32#include "action.h"
32#include "settings.h" 33#include "settings.h"
33#include "tagcache.h" 34#include "tagcache.h"
34#include "tagtree.h" 35#include "tagtree.h"
@@ -539,7 +540,7 @@ bool show_search_progress(bool init, int count)
539 str(LANG_OFF_ABORT) 540 str(LANG_OFF_ABORT)
540#endif 541#endif
541 ); 542 );
542 if (SETTINGS_CANCEL == button_get(false)) 543 if (action_userabort(TIMEOUT_NOBLOCK))
543 return false; 544 return false;
544 last_tick = current_tick; 545 last_tick = current_tick;
545 yield(); 546 yield();
diff --git a/apps/tree.c b/apps/tree.c
index 2f1d140ad9..34d5d0b1bb 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -72,6 +72,7 @@
72#include "splash.h" 72#include "splash.h"
73#include "buttonbar.h" 73#include "buttonbar.h"
74#include "textarea.h" 74#include "textarea.h"
75#include "action.h"
75 76
76#ifdef HAVE_LCD_BITMAP 77#ifdef HAVE_LCD_BITMAP
77#include "widgets.h" 78#include "widgets.h"
@@ -590,28 +591,11 @@ static bool dirbrowse(void)
590 boot_changed = false; 591 boot_changed = false;
591 } 592 }
592#endif 593#endif
593 button = button_get_w_tmo(HZ/5); 594 button = get_action(CONTEXT_TREE,HZ/5);
594 need_update = gui_synclist_do_button(&tree_lists, button); 595 need_update = gui_synclist_do_button(&tree_lists, button);
595 596
596 switch ( button ) { 597 switch ( button ) {
597#ifdef TREE_ENTER 598 case ACTION_STD_OK:
598 case TREE_ENTER | BUTTON_REL:
599 if (lastbutton != TREE_ENTER)
600 break;
601#endif
602#ifdef TREE_RC_RUN
603 case TREE_RC_RUN:
604#endif
605 case TREE_RUN:
606#ifdef TREE_RUN_PRE
607 if (((button == TREE_RUN)
608#ifdef TREE_RC_RUN_PRE
609 || (button == TREE_RC_RUN))
610 && ((lastbutton != TREE_RC_RUN_PRE)
611#endif
612 && (lastbutton != TREE_RUN_PRE)))
613 break;
614#endif
615 /* nothing to do if no files to display */ 599 /* nothing to do if no files to display */
616 if ( numentries == 0 ) 600 if ( numentries == 0 )
617 break; 601 break;
@@ -626,31 +610,27 @@ static bool dirbrowse(void)
626 restore = true; 610 restore = true;
627 break; 611 break;
628 612
629 case TREE_EXIT | BUTTON_REL: 613 case ACTION_STD_CANCEL:
630 if (lastbutton != TREE_EXIT)
631 break;
632#ifdef TREE_RC_EXIT
633 case TREE_RC_EXIT:
634#endif
635 if (*tc.dirfilter > NUM_FILTER_MODES && tc.dirlevel < 1) { 614 if (*tc.dirfilter > NUM_FILTER_MODES && tc.dirlevel < 1) {
636 exit_func = true; 615 exit_func = true;
637 break; 616 break;
638 } 617 }
639 /* if we are in /, nothing to do */ 618 /* if we are in /, stop playback
640 if (tc.dirlevel == 0 && !strcmp(currdir,"/")) 619 (skip this and fall into tree_stop)*/
620 if (tc.dirlevel != 0 || strcmp(currdir,"/"))
621 {
622 if (id3db)
623 tagtree_exit(&tc);
624 else
625 if (ft_exit(&tc) == 3)
626 exit_func = true;
627
628 restore = true;
641 break; 629 break;
630 }
631 /* else fall through */
642 632
643 if (id3db) 633 case ACTION_TREE_STOP:
644 tagtree_exit(&tc);
645 else
646 if (ft_exit(&tc) == 3)
647 exit_func = true;
648
649 restore = true;
650 break;
651
652#ifdef TREE_OFF
653 case TREE_OFF:
654 if (*tc.dirfilter < NUM_FILTER_MODES) 634 if (*tc.dirfilter < NUM_FILTER_MODES)
655 { 635 {
656 /* Stop the music if it is playing */ 636 /* Stop the music if it is playing */
@@ -676,6 +656,7 @@ static bool dirbrowse(void)
676#endif 656#endif
677 } 657 }
678 break; 658 break;
659 /* ??
679#if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING) 660#if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
680 case TREE_OFF | BUTTON_REPEAT: 661 case TREE_OFF | BUTTON_REPEAT:
681 if (charger_inserted()) { 662 if (charger_inserted()) {
@@ -684,25 +665,15 @@ static bool dirbrowse(void)
684 } 665 }
685 break; 666 break;
686#endif 667#endif
687#endif /* TREE_OFF */ 668 */
688 case TREE_MENU: 669 case ACTION_STD_MENU:
689#ifdef TREE_RC_MENU
690 case TREE_RC_MENU:
691#endif
692#ifdef TREE_MENU_PRE
693 if (lastbutton != TREE_MENU_PRE
694#ifdef TREE_RC_MENU_PRE
695 && lastbutton != TREE_RC_MENU_PRE
696#endif
697 )
698 break;
699#endif
700 /* don't enter menu from plugin browser */ 670 /* don't enter menu from plugin browser */
701 if (*tc.dirfilter < NUM_FILTER_MODES) 671 if (*tc.dirfilter < NUM_FILTER_MODES)
702 { 672 {
703 int i; 673 int i;
704 FOR_NB_SCREENS(i) 674 FOR_NB_SCREENS(i)
705 screens[i].stop_scroll(); 675 screens[i].stop_scroll();
676 action_signalscreenchange();
706 if (main_menu()) 677 if (main_menu())
707 reload_dir = true; 678 reload_dir = true;
708 restore = true; 679 restore = true;
@@ -715,18 +686,7 @@ static bool dirbrowse(void)
715 exit_func = true; 686 exit_func = true;
716 break; 687 break;
717 688
718 case TREE_WPS: 689 case ACTION_TREE_WPS:
719#ifdef TREE_RC_WPS
720 case TREE_RC_WPS:
721#endif
722#ifdef TREE_WPS_PRE
723 if ((lastbutton != TREE_WPS_PRE)
724#ifdef TREE_RC_WPS
725 && (lastbutton != TREE_RC_WPS_PRE)
726#endif
727 )
728 break;
729#endif
730 /* don't enter wps from plugin browser etc */ 690 /* don't enter wps from plugin browser etc */
731 if (*tc.dirfilter < NUM_FILTER_MODES) 691 if (*tc.dirfilter < NUM_FILTER_MODES)
732 { 692 {
@@ -741,12 +701,8 @@ static bool dirbrowse(void)
741 } 701 }
742 } 702 }
743 break; 703 break;
744
745#ifdef HAVE_QUICKSCREEN 704#ifdef HAVE_QUICKSCREEN
746 case TREE_QUICK: 705 case ACTION_STD_QUICKSCREEN:
747#ifdef TREE_RC_QUICK
748 case TREE_RC_QUICK:
749#endif
750 /* don't enter f2 from plugin browser */ 706 /* don't enter f2 from plugin browser */
751 if (*tc.dirfilter < NUM_FILTER_MODES) 707 if (*tc.dirfilter < NUM_FILTER_MODES)
752 { 708 {
@@ -759,7 +715,6 @@ static bool dirbrowse(void)
759 } 715 }
760 break; 716 break;
761#endif 717#endif
762
763#ifdef BUTTON_F3 718#ifdef BUTTON_F3
764 case BUTTON_F3: 719 case BUTTON_F3:
765 /* don't enter f3 from plugin browser */ 720 /* don't enter f3 from plugin browser */
@@ -772,13 +727,7 @@ static bool dirbrowse(void)
772 break; 727 break;
773#endif 728#endif
774 729
775 case TREE_CONTEXT: 730 case ACTION_STD_CONTEXT:
776#ifdef TREE_RC_CONTEXT
777 case TREE_RC_CONTEXT:
778#endif
779#ifdef TREE_CONTEXT2
780 case TREE_CONTEXT2:
781#endif
782 { 731 {
783 int onplay_result; 732 int onplay_result;
784 int attr = 0; 733 int attr = 0;
@@ -827,7 +776,7 @@ static bool dirbrowse(void)
827 break; 776 break;
828 } 777 }
829 778
830 case BUTTON_NONE: 779 case ACTION_NONE:
831 if (thumbnail_time != -1 && 780 if (thumbnail_time != -1 &&
832 TIME_AFTER(current_tick, thumbnail_time)) 781 TIME_AFTER(current_tick, thumbnail_time))
833 { /* a delayed hovering thumbnail is due now */ 782 { /* a delayed hovering thumbnail is due now */
@@ -947,7 +896,6 @@ static bool dirbrowse(void)
947 lastfilter = *tc.dirfilter; 896 lastfilter = *tc.dirfilter;
948 lastsortcase = global_settings.sort_case; 897 lastsortcase = global_settings.sort_case;
949 restore = true; 898 restore = true;
950 button_clear_queue(); /* clear button queue */
951 } 899 }
952 900
953 if (exit_func) 901 if (exit_func)
@@ -1045,7 +993,7 @@ static bool dirbrowse(void)
1045 } 993 }
1046 } 994 }
1047 } 995 }
1048 996 action_signalscreenchange();
1049 return true; 997 return true;
1050} 998}
1051 999
@@ -1057,7 +1005,7 @@ static bool add_dir(char* dirname, int len, int fd)
1057 DIRCACHED* dir; 1005 DIRCACHED* dir;
1058 1006
1059 /* check for user abort */ 1007 /* check for user abort */
1060 if (button_get(false) == TREE_ABORT) 1008 if (action_userabort(TIMEOUT_NOBLOCK))
1061 return true; 1009 return true;
1062 1010
1063 dir = opendir_cached(dirname); 1011 dir = opendir_cached(dirname);
diff --git a/apps/tree.h b/apps/tree.h
index 43242d6633..ffe6d478c6 100644
--- a/apps/tree.h
+++ b/apps/tree.h
@@ -23,166 +23,6 @@
23#include <applimits.h> 23#include <applimits.h>
24#include <file.h> 24#include <file.h>
25 25
26#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
27 (CONFIG_KEYPAD == IRIVER_H300_PAD)
28#define TREE_EXIT BUTTON_LEFT
29#define TREE_ABORT BUTTON_OFF
30#define TREE_ENTER BUTTON_RIGHT
31#define TREE_RUN (BUTTON_SELECT | BUTTON_REL)
32#define TREE_RUN_PRE BUTTON_SELECT
33#define TREE_MENU ( BUTTON_MODE | BUTTON_REL)
34#define TREE_MENU_PRE BUTTON_MODE
35#define TREE_OFF BUTTON_OFF
36#define TREE_WPS (BUTTON_ON | BUTTON_REL)
37#define TREE_WPS_PRE BUTTON_ON
38#define TREE_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
39#define TREE_CONTEXT2 (BUTTON_ON | BUTTON_SELECT)
40#define TREE_QUICK (BUTTON_MODE | BUTTON_REPEAT)
41
42/* Remote keys */
43#define TREE_RC_NEXT BUTTON_RC_FF
44#define TREE_RC_PREV BUTTON_RC_REW
45#define TREE_RC_PGUP BUTTON_RC_SOURCE
46#define TREE_RC_PGDN BUTTON_RC_BITRATE
47#define TREE_RC_EXIT BUTTON_RC_STOP
48#define TREE_RC_RUN (BUTTON_RC_MENU | BUTTON_REL)
49#define TREE_RC_RUN_PRE BUTTON_RC_MENU
50#define TREE_RC_MENU (BUTTON_RC_MODE | BUTTON_REL)
51#define TREE_RC_MENU_PRE BUTTON_RC_MODE
52#define TREE_RC_WPS (BUTTON_RC_ON | BUTTON_REL)
53#define TREE_RC_WPS_PRE BUTTON_RC_ON
54#define TREE_RC_CONTEXT (BUTTON_RC_ON | BUTTON_REPEAT)
55#define TREE_RC_QUICK (BUTTON_RC_MODE | BUTTON_REPEAT)
56
57#elif CONFIG_KEYPAD == RECORDER_PAD
58#define TREE_EXIT BUTTON_LEFT
59#define TREE_ABORT BUTTON_OFF
60#define TREE_ENTER BUTTON_RIGHT
61#define TREE_RUN (BUTTON_PLAY | BUTTON_REL)
62#define TREE_RUN_PRE BUTTON_PLAY
63#define TREE_MENU BUTTON_F1
64#define TREE_OFF BUTTON_OFF
65#define TREE_WPS (BUTTON_ON | BUTTON_REL)
66#define TREE_WPS_PRE BUTTON_ON
67#define TREE_CONTEXT (BUTTON_PLAY | BUTTON_REPEAT)
68#define TREE_CONTEXT2 (BUTTON_ON | BUTTON_PLAY)
69#define TREE_QUICK BUTTON_F2
70
71#define TREE_RC_NEXT BUTTON_RC_RIGHT
72#define TREE_RC_PREV BUTTON_RC_LEFT
73#define TREE_RC_EXIT BUTTON_RC_STOP
74#define TREE_RC_RUN BUTTON_RC_PLAY
75
76#elif CONFIG_KEYPAD == PLAYER_PAD
77#define TREE_EXIT BUTTON_STOP
78#define TREE_ABORT BUTTON_STOP
79#define TREE_RUN (BUTTON_PLAY | BUTTON_REL)
80#define TREE_RUN_PRE BUTTON_PLAY
81#define TREE_MENU BUTTON_MENU
82#define TREE_WPS (BUTTON_ON | BUTTON_REL)
83#define TREE_WPS_PRE BUTTON_ON
84#define TREE_CONTEXT (BUTTON_PLAY | BUTTON_REPEAT)
85#define TREE_CONTEXT2 (BUTTON_ON | BUTTON_PLAY)
86
87#define TREE_RC_NEXT BUTTON_RC_RIGHT
88#define TREE_RC_PREV BUTTON_RC_LEFT
89#define TREE_RC_EXIT BUTTON_RC_STOP
90#define TREE_RC_RUN BUTTON_RC_PLAY
91
92#elif CONFIG_KEYPAD == ONDIO_PAD
93#define TREE_EXIT BUTTON_LEFT
94#define TREE_ABORT BUTTON_OFF
95#define TREE_RUN (BUTTON_RIGHT | BUTTON_REL)
96#define TREE_RUN_PRE BUTTON_RIGHT
97#define TREE_MENU (BUTTON_MENU | BUTTON_REPEAT)
98#define TREE_MENU_PRE BUTTON_MENU
99#define TREE_OFF BUTTON_OFF
100#define TREE_WPS (BUTTON_MENU | BUTTON_REL)
101#define TREE_WPS_PRE BUTTON_MENU
102#define TREE_CONTEXT (BUTTON_RIGHT | BUTTON_REPEAT)
103
104#elif CONFIG_KEYPAD == GMINI100_PAD
105#define TREE_EXIT BUTTON_LEFT
106#define TREE_ENTER BUTTON_RIGHT
107#define TREE_RUN (BUTTON_PLAY | BUTTON_REL)
108#define TREE_RUN_PRE BUTTON_PLAY
109#define TREE_MENU BUTTON_MENU
110#define TREE_WPS (BUTTON_ON | BUTTON_REL)
111#define TREE_WPS_PRE BUTTON_ON
112#define TREE_CONTEXT (BUTTON_PLAY | BUTTON_REPEAT)
113#define TREE_CONTEXT2 (BUTTON_ON | BUTTON_PLAY)
114
115#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
116
117#define TREE_EXIT BUTTON_LEFT
118#define TREE_ABORT BUTTON_LEFT
119#define TREE_ENTER BUTTON_RIGHT
120#define TREE_RUN (BUTTON_SELECT | BUTTON_REL)
121#define TREE_RUN_PRE BUTTON_SELECT
122#define TREE_MENU (BUTTON_MENU | BUTTON_REL)
123#define TREE_MENU_PRE BUTTON_MENU
124#define TREE_WPS (BUTTON_PLAY | BUTTON_REL)
125#define TREE_WPS_PRE BUTTON_PLAY
126#define TREE_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
127#define TREE_QUICK (BUTTON_MENU | BUTTON_REPEAT)
128
129#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
130
131#define TREE_EXIT BUTTON_LEFT
132#define TREE_ABORT BUTTON_PLAY
133#define TREE_RUN (BUTTON_RIGHT | BUTTON_REL)
134#define TREE_RUN_PRE BUTTON_RIGHT
135#define TREE_MENU (BUTTON_SELECT | BUTTON_REPEAT)
136#define TREE_MENU_PRE BUTTON_SELECT
137#define TREE_WPS (BUTTON_SELECT | BUTTON_REL)
138#define TREE_WPS_PRE BUTTON_SELECT
139#define TREE_CONTEXT (BUTTON_RIGHT | BUTTON_REPEAT)
140
141#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
142
143#define TREE_EXIT BUTTON_LEFT
144#define TREE_ABORT BUTTON_REC
145#define TREE_ENTER BUTTON_RIGHT
146#define TREE_RUN (BUTTON_SELECT | BUTTON_REL)
147#define TREE_RUN_PRE BUTTON_SELECT
148#define TREE_MENU (BUTTON_REC | BUTTON_REL)
149#define TREE_MENU_PRE BUTTON_REC
150#define TREE_WPS (BUTTON_PLAY | BUTTON_REL)
151#define TREE_WPS_PRE BUTTON_PLAY
152#define TREE_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
153#define TREE_QUICK (BUTTON_REC | BUTTON_REPEAT)
154
155#elif CONFIG_KEYPAD == GIGABEAT_PAD
156
157#define TREE_NEXT BUTTON_DOWN
158#define TREE_PREV BUTTON_UP
159#define TREE_EXIT BUTTON_LEFT
160#define TREE_ABORT BUTTON_A
161#define TREE_ENTER BUTTON_RIGHT
162#define TREE_RUN (BUTTON_SELECT | BUTTON_REL)
163#define TREE_RUN_PRE BUTTON_SELECT
164#define TREE_MENU (BUTTON_MENU | BUTTON_REL)
165#define TREE_MENU_PRE BUTTON_MENU
166#define TREE_WPS (BUTTON_POWER | BUTTON_REL)
167#define TREE_WPS_PRE BUTTON_POWER
168#define TREE_CONTEXT (BUTTON_SELECT | BUTTON_REPEAT)
169
170#elif CONFIG_KEYPAD == IRIVER_H10_PAD
171
172#define TREE_EXIT BUTTON_LEFT
173#define TREE_ABORT BUTTON_LEFT
174#define TREE_ENTER BUTTON_RIGHT
175#define TREE_RUN (BUTTON_PLAY | BUTTON_REL)
176#define TREE_RUN_PRE BUTTON_PLAY
177#define TREE_MENU (BUTTON_REW | BUTTON_REL)
178#define TREE_MENU_PRE BUTTON_REW
179#define TREE_WPS (BUTTON_FF | BUTTON_REL)
180#define TREE_WPS_PRE BUTTON_FF
181#define TREE_CONTEXT (BUTTON_PLAY | BUTTON_SCROLL_UP)
182#define TREE_QUICK (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
183
184#endif
185
186struct entry { 26struct entry {
187 short attr; /* FAT attributes + file type flags */ 27 short attr; /* FAT attributes + file type flags */
188 unsigned long time_write; /* Last write time */ 28 unsigned long time_write; /* Last write time */
diff --git a/firmware/drivers/lcd-h100-remote.c b/firmware/drivers/lcd-h100-remote.c
index 8c1176bad8..6c1a1d4d0d 100644
--- a/firmware/drivers/lcd-h100-remote.c
+++ b/firmware/drivers/lcd-h100-remote.c
@@ -519,7 +519,12 @@ static void remote_tick(void)
519 if (cs_countdown == 0) 519 if (cs_countdown == 0)
520 CS_HI; 520 CS_HI;
521} 521}
522#endif /* !SIMULATOR */ 522#else
523int remote_type(void)
524{
525 return REMOTETYPE_UNPLUGGED;
526}
527#endif/* !SIMULATOR */
523 528
524/* LCD init */ 529/* LCD init */
525#ifdef SIMULATOR 530#ifdef SIMULATOR