summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-08-23 12:32:52 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-08-23 12:32:52 +0000
commitb285076925fed906d95573b64115cb3f6bdafe65 (patch)
tree6d959f585fc210acf39e667991038d21aef48d13
parentad4a92eb87eb98ff316f54f06650f1c5e1dcd7ca (diff)
downloadrockbox-b285076925fed906d95573b64115cb3f6bdafe65.tar.gz
rockbox-b285076925fed906d95573b64115cb3f6bdafe65.zip
Remade the menu system slightly. All functions invoked from menus now use
the Menu typedef as return type, and *ALL* menus that intercept USB connect can then return MENU_REFRESH_DIR so that the parent (any parent really) that do file or dir-accesses knows that and can do the refresh. If no refresh is needed by the parent, MENU_OK is returned. Somewhat biggish commit this close to 1.3, but we need to sort out this refresh-after-usb-connected business. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1948 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/Makefile2
-rw-r--r--apps/debug_menu.c51
-rw-r--r--apps/debug_menu.h6
-rw-r--r--apps/games_menu.c11
-rw-r--r--apps/games_menu.h4
-rw-r--r--apps/main_menu.c18
-rw-r--r--apps/main_menu.h4
-rw-r--r--apps/menu.c8
-rw-r--r--apps/menu.h12
-rw-r--r--apps/recorder/blank.c16
-rw-r--r--apps/recorder/bounce.c5
-rw-r--r--apps/recorder/boxes.c5
-rw-r--r--apps/recorder/boxes.h4
-rw-r--r--apps/recorder/sokoban.c5
-rw-r--r--apps/recorder/sokoban.h4
-rw-r--r--apps/recorder/tetris.c5
-rw-r--r--apps/screensavers_menu.c11
-rw-r--r--apps/screensavers_menu.h2
-rw-r--r--apps/settings_menu.c45
-rw-r--r--apps/settings_menu.h4
-rw-r--r--apps/sound_menu.c28
-rw-r--r--apps/sound_menu.h4
-rw-r--r--apps/tree.c10
23 files changed, 175 insertions, 89 deletions
diff --git a/apps/Makefile b/apps/Makefile
index e375cb9b1d..8ec3b0a581 100644
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -15,7 +15,7 @@ OC = sh-elf-objcopy
15 15
16FIRMWARE := ../firmware 16FIRMWARE := ../firmware
17 17
18INCLUDES= -I$(FIRMWARE)/include -I$(FIRMWARE) -I$(FIRMWARE)/common -I$(FIRMWARE)/drivers -I$(FIRMWARE)/malloc 18INCLUDES= -I$(FIRMWARE)/include -I$(FIRMWARE) -I$(FIRMWARE)/common -I$(FIRMWARE)/drivers -I$(FIRMWARE)/malloc -I.
19 19
20# Pick a target to build for 20# Pick a target to build for
21#TARGET = -DARCHOS_PLAYER=1 21#TARGET = -DARCHOS_PLAYER=1
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 44079a789d..ed5e8268ea 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -82,7 +82,7 @@ void dbg_os(void)
82 } 82 }
83} 83}
84#else 84#else
85void dbg_os(void) 85Menu dbg_os(void)
86{ 86{
87 char buf[32]; 87 char buf[32];
88 int button; 88 int button;
@@ -109,7 +109,7 @@ void dbg_os(void)
109 switch(button) 109 switch(button)
110 { 110 {
111 case BUTTON_STOP: 111 case BUTTON_STOP:
112 return; 112 return MENU_OK;
113 113
114 case BUTTON_LEFT: 114 case BUTTON_LEFT:
115 currval--; 115 currval--;
@@ -124,12 +124,13 @@ void dbg_os(void)
124 break; 124 break;
125 } 125 }
126 } 126 }
127 return MENU_OK;
127} 128}
128#endif 129#endif
129 130
130#ifdef HAVE_LCD_BITMAP 131#ifdef HAVE_LCD_BITMAP
131/* Test code!!! */ 132/* Test code!!! */
132void dbg_ports(void) 133Menu dbg_ports(void)
133{ 134{
134 unsigned short porta; 135 unsigned short porta;
135 unsigned short portb; 136 unsigned short portb;
@@ -199,12 +200,13 @@ void dbg_ports(void)
199 case BUTTON_LEFT: 200 case BUTTON_LEFT:
200 charger_enable(false); 201 charger_enable(false);
201 ide_power_enable(true); 202 ide_power_enable(true);
202 return; 203 return MENU_OK;
203 } 204 }
204 } 205 }
206 return MENU_OK;
205} 207}
206#else 208#else
207void dbg_ports(void) 209Menu dbg_ports(void)
208{ 210{
209 unsigned short porta; 211 unsigned short porta;
210 unsigned short portb; 212 unsigned short portb;
@@ -280,7 +282,7 @@ void dbg_ports(void)
280 switch(button) 282 switch(button)
281 { 283 {
282 case BUTTON_STOP: 284 case BUTTON_STOP:
283 return; 285 return MENU_OK;
284 286
285 case BUTTON_LEFT: 287 case BUTTON_LEFT:
286 currval--; 288 currval--;
@@ -295,12 +297,13 @@ void dbg_ports(void)
295 break; 297 break;
296 } 298 }
297 } 299 }
300 return MENU_OK;
298} 301}
299#endif 302#endif
300 303
301#ifdef HAVE_RTC 304#ifdef HAVE_RTC
302/* Read RTC RAM contents and display them */ 305/* Read RTC RAM contents and display them */
303void dbg_rtc(void) 306Menu dbg_rtc(void)
304{ 307{
305 char buf[32]; 308 char buf[32];
306 unsigned char addr = 0, r, c; 309 unsigned char addr = 0, r, c;
@@ -344,14 +347,15 @@ void dbg_rtc(void)
344 break; 347 break;
345 case BUTTON_OFF: 348 case BUTTON_OFF:
346 case BUTTON_LEFT: 349 case BUTTON_LEFT:
347 return; 350 return MENU_OK;
348 } 351 }
349 } 352 }
353 return MENU_OK;
350} 354}
351#else 355#else
352void dbg_rtc(void) 356Menu dbg_rtc(void)
353{ 357{
354 return; 358 return MENU_OK;
355} 359}
356#endif 360#endif
357 361
@@ -361,7 +365,7 @@ void dbg_rtc(void)
361#define NUMROWS 4 365#define NUMROWS 4
362#endif 366#endif
363/* Read MAS registers and display them */ 367/* Read MAS registers and display them */
364void dbg_mas(void) 368Menu dbg_mas(void)
365{ 369{
366 char buf[32]; 370 char buf[32];
367 unsigned int addr = 0, r, i; 371 unsigned int addr = 0, r, i;
@@ -405,13 +409,14 @@ void dbg_mas(void)
405#else 409#else
406 case BUTTON_DOWN: 410 case BUTTON_DOWN:
407#endif 411#endif
408 return; 412 return MENU_OK;
409 } 413 }
410 } 414 }
415 return MENU_OK;
411} 416}
412 417
413#ifdef HAVE_MAS3587F 418#ifdef HAVE_MAS3587F
414void dbg_mas_codec(void) 419Menu dbg_mas_codec(void)
415{ 420{
416 char buf[32]; 421 char buf[32];
417 unsigned int addr = 0, r, i; 422 unsigned int addr = 0, r, i;
@@ -442,9 +447,10 @@ void dbg_mas_codec(void)
442 if (addr) { addr -= 4; } 447 if (addr) { addr -= 4; }
443 break; 448 break;
444 case BUTTON_LEFT: 449 case BUTTON_LEFT:
445 return; 450 return MENU_OK;
446 } 451 }
447 } 452 }
453 return MENU_OK;
448} 454}
449#endif 455#endif
450 456
@@ -458,7 +464,7 @@ void dbg_mas_codec(void)
458#define BAT_FIRST_VAL MAX(POWER_HISTORY_LEN - LCD_WIDTH - 1, 0) 464#define BAT_FIRST_VAL MAX(POWER_HISTORY_LEN - LCD_WIDTH - 1, 0)
459#define BAT_YSPACE (LCD_HEIGHT - 20) 465#define BAT_YSPACE (LCD_HEIGHT - 20)
460 466
461void view_battery(void) 467Menu view_battery(void)
462{ 468{
463 int view = 0; 469 int view = 0;
464 int i, x, y; 470 int i, x, y;
@@ -579,15 +585,16 @@ void view_battery(void)
579 585
580 case BUTTON_LEFT: 586 case BUTTON_LEFT:
581 case BUTTON_OFF: 587 case BUTTON_OFF:
582 return; 588 return MENU_OK;
583 } 589 }
584 } 590 }
591 return MENU_OK;
585} 592}
586 593
587#endif 594#endif
588 595
589#ifdef HAVE_MAS3507D 596#ifdef HAVE_MAS3507D
590void dbg_mas_info(void) 597Menu dbg_mas_info(void)
591{ 598{
592 int button; 599 int button;
593 char buf[32]; 600 char buf[32];
@@ -721,7 +728,7 @@ void dbg_mas_info(void)
721 switch(button) 728 switch(button)
722 { 729 {
723 case BUTTON_STOP: 730 case BUTTON_STOP:
724 return; 731 return MENU_OK;
725 732
726 case BUTTON_LEFT: 733 case BUTTON_LEFT:
727 currval--; 734 currval--;
@@ -757,12 +764,14 @@ void dbg_mas_info(void)
757 break; 764 break;
758 } 765 }
759 } 766 }
767 return MENU_OK;
760} 768}
761#endif 769#endif
762 770
763void debug_menu(void) 771Menu debug_menu(void)
764{ 772{
765 int m; 773 int m;
774 Menu result;
766 775
767 struct menu_items items[] = { 776 struct menu_items items[] = {
768 { "View I/O ports", dbg_ports }, 777 { "View I/O ports", dbg_ports },
@@ -785,8 +794,10 @@ void debug_menu(void)
785 }; 794 };
786 795
787 m=menu_init( items, sizeof items / sizeof(struct menu_items) ); 796 m=menu_init( items, sizeof items / sizeof(struct menu_items) );
788 menu_run(m); 797 result = menu_run(m);
789 menu_exit(m); 798 menu_exit(m);
799
800 return result;
790} 801}
791 802
792#endif /* SIMULATOR */ 803#endif /* SIMULATOR */
diff --git a/apps/debug_menu.h b/apps/debug_menu.h
index 78b344bce3..5dcc3ac183 100644
--- a/apps/debug_menu.h
+++ b/apps/debug_menu.h
@@ -19,12 +19,12 @@
19#ifndef _DEBUG_MENU_H 19#ifndef _DEBUG_MENU_H
20#define _DEBUG_MENU_H 20#define _DEBUG_MENU_H
21 21
22void debug_menu(void); 22Menu debug_menu(void);
23 23
24#ifndef SIMULATOR 24#ifndef SIMULATOR
25extern void dbg_ports(void); 25extern Menu dbg_ports(void);
26#ifdef HAVE_RTC 26#ifdef HAVE_RTC
27extern void dbg_rtc(void); 27extern Menu dbg_rtc(void);
28#endif 28#endif
29#endif 29#endif
30 30
diff --git a/apps/games_menu.c b/apps/games_menu.c
index 1d30fbbcce..3850a4f0ab 100644
--- a/apps/games_menu.c
+++ b/apps/games_menu.c
@@ -29,11 +29,12 @@
29#include "sprintf.h" 29#include "sprintf.h"
30 30
31#include "sokoban.h" 31#include "sokoban.h"
32extern void tetris(void); 32extern Menu tetris(void);
33 33
34void games_menu(void) 34Menu games_menu(void)
35{ 35{
36 int m; 36 int m;
37 Menu result;
37 38
38 struct menu_items items[] = { 39 struct menu_items items[] = {
39 { "Tetris", tetris }, 40 { "Tetris", tetris },
@@ -41,10 +42,10 @@ void games_menu(void)
41 }; 42 };
42 43
43 m=menu_init( items, sizeof items / sizeof(struct menu_items) ); 44 m=menu_init( items, sizeof items / sizeof(struct menu_items) );
44 menu_run(m); 45 result = menu_run(m);
45 menu_exit(m); 46 menu_exit(m);
47
48 return result;
46} 49}
47 50
48#endif 51#endif
49
50
diff --git a/apps/games_menu.h b/apps/games_menu.h
index 861c27bfac..a179a2a8ea 100644
--- a/apps/games_menu.h
+++ b/apps/games_menu.h
@@ -19,6 +19,8 @@
19#ifndef _GAMES_MENU_H 19#ifndef _GAMES_MENU_H
20#define _GAMES_MENU_H 20#define _GAMES_MENU_H
21 21
22void games_menu(void); 22#include "menu.h"
23
24Menu games_menu(void);
23 25
24#endif 26#endif
diff --git a/apps/main_menu.c b/apps/main_menu.c
index 2cb9bda9bd..885deea6c4 100644
--- a/apps/main_menu.c
+++ b/apps/main_menu.c
@@ -105,7 +105,7 @@ int show_logo( void )
105 return 0; 105 return 0;
106} 106}
107 107
108void show_credits(void) 108Menu show_credits(void)
109{ 109{
110 int j = 0; 110 int j = 0;
111 int btn; 111 int btn;
@@ -120,22 +120,23 @@ void show_credits(void)
120 120
121 btn = button_get(false); 121 btn = button_get(false);
122 if (btn != BUTTON_NONE && !(btn & BUTTON_REL)) 122 if (btn != BUTTON_NONE && !(btn & BUTTON_REL))
123 return; 123 return MENU_OK;
124 } 124 }
125 roll_credits(); 125 roll_credits();
126 return MENU_OK;
126} 127}
127 128
128#ifdef SIMULATOR 129#ifdef SIMULATOR
129#define mp3buf 0 130#define mp3buf 0
130#define mp3end 0 131#define mp3end 0
131 132
132extern void simulate_usb(void); 133extern Menu simulate_usb(void);
133#else 134#else
134/* defined in linker script */ 135/* defined in linker script */
135extern unsigned char mp3buf[]; 136extern unsigned char mp3buf[];
136extern unsigned char mp3end[]; 137extern unsigned char mp3end[];
137#endif 138#endif
138void show_info(void) 139Menu show_info(void)
139{ 140{
140 char s[32]; 141 char s[32];
141 int buflen = ((mp3end - mp3buf) * 100) / 0x100000; 142 int buflen = ((mp3end - mp3buf) * 100) / 0x100000;
@@ -181,11 +182,14 @@ void show_info(void)
181 if(button_get(false) & ~BUTTON_REL) 182 if(button_get(false) & ~BUTTON_REL)
182 done = true; 183 done = true;
183 } 184 }
185
186 return MENU_OK;
184} 187}
185 188
186void main_menu(void) 189Menu main_menu(void)
187{ 190{
188 int m; 191 int m;
192 Menu result;
189 193
190 /* main menu */ 194 /* main menu */
191 struct menu_items items[] = { 195 struct menu_items items[] = {
@@ -208,11 +212,13 @@ void main_menu(void)
208#ifdef HAVE_LCD_CHARCELLS 212#ifdef HAVE_LCD_CHARCELLS
209 lcd_icon(ICON_PARAM, true); 213 lcd_icon(ICON_PARAM, true);
210#endif 214#endif
211 menu_run(m); 215 result = menu_run(m);
212#ifdef HAVE_LCD_CHARCELLS 216#ifdef HAVE_LCD_CHARCELLS
213 lcd_icon(ICON_PARAM, false); 217 lcd_icon(ICON_PARAM, false);
214#endif 218#endif
215 menu_exit(m); 219 menu_exit(m);
216 220
217 settings_save(); 221 settings_save();
222
223 return result;
218} 224}
diff --git a/apps/main_menu.h b/apps/main_menu.h
index 54cc6023c7..8efcd6f380 100644
--- a/apps/main_menu.h
+++ b/apps/main_menu.h
@@ -19,7 +19,9 @@
19#ifndef _MAIN_MENU_H 19#ifndef _MAIN_MENU_H
20#define _MAIN_MENU_H 20#define _MAIN_MENU_H
21 21
22#include "menu.h"
23
22extern int show_logo(void); 24extern int show_logo(void);
23extern void main_menu(void); 25extern Menu main_menu(void);
24 26
25#endif 27#endif
diff --git a/apps/menu.c b/apps/menu.c
index 418ccf309d..b0060f4df4 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -212,13 +212,14 @@ void menu_exit(int m)
212 inuse[m] = false; 212 inuse[m] = false;
213} 213}
214 214
215void menu_run(int m) 215Menu menu_run(int m)
216{ 216{
217#ifndef SIMULATOR 217#ifndef SIMULATOR
218#ifdef HAVE_LCD_BITMAP 218#ifdef HAVE_LCD_BITMAP
219 bool laststate; 219 bool laststate;
220#endif 220#endif
221#endif 221#endif
222 Menu result = MENU_OK;
222 223
223 menu_draw(m); 224 menu_draw(m);
224 225
@@ -273,7 +274,7 @@ void menu_run(int m)
273 case BUTTON_MENU: 274 case BUTTON_MENU:
274#endif 275#endif
275 lcd_stop_scroll(); 276 lcd_stop_scroll();
276 return; 277 return result;
277 278
278#ifdef HAVE_RECORDER_KEYPAD 279#ifdef HAVE_RECORDER_KEYPAD
279 case BUTTON_F3: 280 case BUTTON_F3:
@@ -298,6 +299,7 @@ void menu_run(int m)
298#else 299#else
299 lcd_icon(ICON_PARAM, true); 300 lcd_icon(ICON_PARAM, true);
300#endif 301#endif
302 result = MENU_REFRESH_DIR;
301 break; 303 break;
302#endif 304#endif
303 305
@@ -308,4 +310,6 @@ void menu_run(int m)
308 status_draw(); 310 status_draw();
309 lcd_update(); 311 lcd_update();
310 } 312 }
313
314 return result;
311} 315}
diff --git a/apps/menu.h b/apps/menu.h
index 0871e502c8..fc962c79aa 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -22,15 +22,23 @@
22 22
23#include <stdbool.h> 23#include <stdbool.h>
24 24
25typedef enum {
26 MENU_OK,
27 MENU_REFRESH_DIR, /* any file/directory contents need to be re-read */
28 MENU_LAST /* don't use as return code, only for number of return codes
29 available */
30} Menu;
31
25struct menu_items { 32struct menu_items {
26 char *desc; 33 char *desc;
27 void (*function) (void); 34 Menu (*function) (void);
28}; 35};
29 36
30int menu_init(struct menu_items* items, int count); 37int menu_init(struct menu_items* items, int count);
31void menu_exit(int menu); 38void menu_exit(int menu);
32void menu_run(int menu);
33 39
34void put_cursorxy(int x, int y, bool on); 40void put_cursorxy(int x, int y, bool on);
35 41
42Menu menu_run(int menu);
43
36#endif /* End __MENU_H__ */ 44#endif /* End __MENU_H__ */
diff --git a/apps/recorder/blank.c b/apps/recorder/blank.c
index 835420f63b..2c59ec66bc 100644
--- a/apps/recorder/blank.c
+++ b/apps/recorder/blank.c
@@ -24,6 +24,7 @@
24#include "lcd.h" 24#include "lcd.h"
25#include "button.h" 25#include "button.h"
26#include "kernel.h" 26#include "kernel.h"
27#include "menu.h"
27 28
28#ifdef SIMULATOR 29#ifdef SIMULATOR
29#include <stdio.h> 30#include <stdio.h>
@@ -33,7 +34,7 @@
33#define SS_TITLE "Blank" 34#define SS_TITLE "Blank"
34#define SS_TITLE_FONT 2 35#define SS_TITLE_FONT 2
35 36
36void blank(void) 37Menu blank(void)
37{ 38{
38 int w, h; 39 int w, h;
39 char *off = "[Off] to stop"; 40 char *off = "[Off] to stop";
@@ -76,15 +77,16 @@ void blank(void)
76 lcd_update(); 77 lcd_update();
77 sleep(HZ); 78 sleep(HZ);
78 79
79 lcd_clear_display(); 80 lcd_clear_display();
80 lcd_update(); 81 lcd_update();
81 82
82 while(1) { 83 while(1) {
83 if(button_get(false)) 84 if(button_get(false))
84 return; 85 return MENU_OK;
85 sleep(HZ/10); 86 sleep(HZ/10);
86 } 87 }
87 88
89 return MENU_OK;
88} 90}
89 91
90#endif 92#endif
diff --git a/apps/recorder/bounce.c b/apps/recorder/bounce.c
index 6b500964f0..cb080a0d00 100644
--- a/apps/recorder/bounce.c
+++ b/apps/recorder/bounce.c
@@ -24,6 +24,7 @@
24#include "lcd.h" 24#include "lcd.h"
25#include "button.h" 25#include "button.h"
26#include "kernel.h" 26#include "kernel.h"
27#include "menu.h"
27 28
28#ifdef SIMULATOR 29#ifdef SIMULATOR
29#include <stdio.h> 30#include <stdio.h>
@@ -83,7 +84,7 @@ static void loopit(void)
83} 84}
84 85
85 86
86void bounce(void) 87Menu bounce(void)
87{ 88{
88 int w, h; 89 int w, h;
89 char *off = "[Off] to stop"; 90 char *off = "[Off] to stop";
@@ -126,6 +127,8 @@ void bounce(void)
126 lcd_update(); 127 lcd_update();
127 sleep(HZ); 128 sleep(HZ);
128 loopit(); 129 loopit();
130
131 return MENU_OK;
129} 132}
130 133
131#endif 134#endif
diff --git a/apps/recorder/boxes.c b/apps/recorder/boxes.c
index 6b6d0065c9..60fdef6f9b 100644
--- a/apps/recorder/boxes.c
+++ b/apps/recorder/boxes.c
@@ -25,6 +25,7 @@
25#include "lcd.h" 25#include "lcd.h"
26#include "button.h" 26#include "button.h"
27#include "kernel.h" 27#include "kernel.h"
28#include "menu.h"
28 29
29#ifdef SIMULATOR 30#ifdef SIMULATOR
30#include <stdio.h> 31#include <stdio.h>
@@ -82,7 +83,7 @@ static void ss_loop(void)
82 } 83 }
83} 84}
84 85
85void boxes(void) 86Menu boxes(void)
86{ 87{
87 int w, h; 88 int w, h;
88 char *off = "[Off] to stop"; 89 char *off = "[Off] to stop";
@@ -125,6 +126,8 @@ void boxes(void)
125 lcd_update(); 126 lcd_update();
126 sleep(HZ/2); 127 sleep(HZ/2);
127 ss_loop(); 128 ss_loop();
129
130 return MENU_OK;
128} 131}
129 132
130#endif 133#endif
diff --git a/apps/recorder/boxes.h b/apps/recorder/boxes.h
index bf3e095a65..2defb0bbfc 100644
--- a/apps/recorder/boxes.h
+++ b/apps/recorder/boxes.h
@@ -20,7 +20,9 @@
20#ifndef __BOXES_H__ 20#ifndef __BOXES_H__
21#define __BOXES_H__ 21#define __BOXES_H__
22 22
23void boxes(void); 23#include "menu.h"
24
25Menu boxes(void);
24 26
25#endif /* __BOXES_H__ */ 27#endif /* __BOXES_H__ */
26 28
diff --git a/apps/recorder/sokoban.c b/apps/recorder/sokoban.c
index 2795d745e6..6ce19e6a41 100644
--- a/apps/recorder/sokoban.c
+++ b/apps/recorder/sokoban.c
@@ -23,6 +23,7 @@
23#include "lcd.h" 23#include "lcd.h"
24#include "button.h" 24#include "button.h"
25#include "kernel.h" 25#include "kernel.h"
26#include "menu.h"
26 27
27#ifdef SIMULATOR 28#ifdef SIMULATOR
28#include <stdio.h> 29#include <stdio.h>
@@ -1334,7 +1335,7 @@ void sokoban_loop(void) {
1334} 1335}
1335 1336
1336 1337
1337void sokoban(void) 1338Menu sokoban(void)
1338{ 1339{
1339 int w, h; 1340 int w, h;
1340 int len = strlen(SOKOBAN_TITLE); 1341 int len = strlen(SOKOBAN_TITLE);
@@ -1371,4 +1372,6 @@ void sokoban(void)
1371 sleep(HZ*2); 1372 sleep(HZ*2);
1372 lcd_clear_display(); 1373 lcd_clear_display();
1373 sokoban_loop(); 1374 sokoban_loop();
1375
1376 return MENU_OK;
1374} 1377}
diff --git a/apps/recorder/sokoban.h b/apps/recorder/sokoban.h
index 8e6c54c43e..ee1398c011 100644
--- a/apps/recorder/sokoban.h
+++ b/apps/recorder/sokoban.h
@@ -20,10 +20,12 @@
20#ifndef __SOKOBAN__ 20#ifndef __SOKOBAN__
21#define __SOKOBAN__ 21#define __SOKOBAN__
22 22
23#include "menu.h"
24
23void load_level(int); 25void load_level(int);
24void update_screen(void); 26void update_screen(void);
25void sokoban_loop(void); 27void sokoban_loop(void);
26void sokoban(void); 28Menu sokoban(void);
27 29
28#endif /*__SOKOBAN__ */ 30#endif /*__SOKOBAN__ */
29 31
diff --git a/apps/recorder/tetris.c b/apps/recorder/tetris.c
index 76d1940889..910374920f 100644
--- a/apps/recorder/tetris.c
+++ b/apps/recorder/tetris.c
@@ -27,6 +27,7 @@
27#include "button.h" 27#include "button.h"
28#include "kernel.h" 28#include "kernel.h"
29#include <string.h> 29#include <string.h>
30#include "menu.h"
30 31
31#ifdef SIMULATOR 32#ifdef SIMULATOR
32#include <stdio.h> 33#include <stdio.h>
@@ -388,7 +389,7 @@ void init_tetris(void)
388 next_f = 0; 389 next_f = 0;
389} 390}
390 391
391void tetris(void) 392Menu tetris(void)
392{ 393{
393 init_tetris(); 394 init_tetris();
394 395
@@ -400,6 +401,8 @@ void tetris(void)
400 next_f = t_rand(block_frames[next_b]); 401 next_f = t_rand(block_frames[next_b]);
401 new_block(); 402 new_block();
402 game_loop(); 403 game_loop();
404
405 return MENU_OK;
403} 406}
404 407
405#endif 408#endif
diff --git a/apps/screensavers_menu.c b/apps/screensavers_menu.c
index a7bd4d422c..b184b916cc 100644
--- a/apps/screensavers_menu.c
+++ b/apps/screensavers_menu.c
@@ -30,12 +30,13 @@
30#include "sprintf.h" 30#include "sprintf.h"
31 31
32#include "boxes.h" 32#include "boxes.h"
33extern void bounce(void); 33extern Menu bounce(void);
34extern void blank(void); 34extern Menu blank(void);
35 35
36void screensavers_menu(void) 36Menu screensavers_menu(void)
37{ 37{
38 int m; 38 int m;
39 Menu result;
39 40
40 struct menu_items items[] = { 41 struct menu_items items[] = {
41 { "Boxes", boxes }, 42 { "Boxes", boxes },
@@ -44,8 +45,10 @@ void screensavers_menu(void)
44 }; 45 };
45 46
46 m=menu_init( items, sizeof items / sizeof(struct menu_items) ); 47 m=menu_init( items, sizeof items / sizeof(struct menu_items) );
47 menu_run(m); 48 result = menu_run(m);
48 menu_exit(m); 49 menu_exit(m);
50
51 return result;
49} 52}
50 53
51#endif 54#endif
diff --git a/apps/screensavers_menu.h b/apps/screensavers_menu.h
index 42a40cf826..cac4c43cc9 100644
--- a/apps/screensavers_menu.h
+++ b/apps/screensavers_menu.h
@@ -19,7 +19,7 @@
19#ifndef _SCREENSAVERS_MENU_H 19#ifndef _SCREENSAVERS_MENU_H
20#define _SCREENSAVERS_MENU_H 20#define _SCREENSAVERS_MENU_H
21 21
22void screensavers_menu(void); 22Menu screensavers_menu(void);
23 23
24#endif 24#endif
25 25
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index 0d88edfff4..2bb4ef4481 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -36,39 +36,45 @@
36#include "powermgmt.h" 36#include "powermgmt.h"
37#include "rtc.h" 37#include "rtc.h"
38 38
39static void show_hidden_files(void) 39static Menu show_hidden_files(void)
40{ 40{
41 set_bool( "[Show hidden files]", &global_settings.show_hidden_files ); 41 set_bool( "[Show hidden files]", &global_settings.show_hidden_files );
42 return MENU_OK;
42} 43}
43 44
44static void contrast(void) 45static Menu contrast(void)
45{ 46{
46 set_int( "[Contrast]", "", &global_settings.contrast, 47 set_int( "[Contrast]", "", &global_settings.contrast,
47 lcd_set_contrast, 1, 0, MAX_CONTRAST_SETTING ); 48 lcd_set_contrast, 1, 0, MAX_CONTRAST_SETTING );
49 return MENU_OK;
48} 50}
49 51
50static void shuffle(void) 52static Menu shuffle(void)
51{ 53{
52 set_bool( "[Shuffle]", &global_settings.playlist_shuffle ); 54 set_bool( "[Shuffle]", &global_settings.playlist_shuffle );
55 return MENU_OK;
53} 56}
54 57
55static void mp3_filter(void) 58static Menu mp3_filter(void)
56{ 59{
57 set_bool( "[MP3/M3U filter]", &global_settings.mp3filter ); 60 set_bool( "[MP3/M3U filter]", &global_settings.mp3filter );
61 return MENU_OK;
58} 62}
59 63
60static void sort_case(void) 64static Menu sort_case(void)
61{ 65{
62 set_bool( "[Sort case sensitive]", &global_settings.sort_case ); 66 set_bool( "[Sort case sensitive]", &global_settings.sort_case );
67 return MENU_OK;
63} 68}
64 69
65static void resume(void) 70static Menu resume(void)
66{ 71{
67 char* names[] = { "off", "ask", "on " }; 72 char* names[] = { "off", "ask", "on " };
68 set_option( "[Resume]", &global_settings.resume, names, 3 ); 73 set_option( "[Resume]", &global_settings.resume, names, 3 );
74 return MENU_OK;
69} 75}
70 76
71static void backlight_timer(void) 77static Menu backlight_timer(void)
72{ 78{
73 char* names[] = { "off", "on ", 79 char* names[] = { "off", "on ",
74 "1s ", "2s ", "3s ", "4s ", "5s ", 80 "1s ", "2s ", "3s ", "4s ", "5s ",
@@ -77,15 +83,17 @@ static void backlight_timer(void)
77 "60s", "90s"}; 83 "60s", "90s"};
78 set_option("[Backlight]", &global_settings.backlight, names, 19 ); 84 set_option("[Backlight]", &global_settings.backlight, names, 19 );
79 backlight_time(global_settings.backlight); 85 backlight_time(global_settings.backlight);
86 return MENU_OK;
80} 87}
81 88
82static void scroll_speed(void) 89static Menu scroll_speed(void)
83{ 90{
84 set_int("Scroll speed indicator...", "", &global_settings.scroll_speed, 91 set_int("Scroll speed indicator...", "", &global_settings.scroll_speed,
85 &lcd_scroll_speed, 1, 1, 20 ); 92 &lcd_scroll_speed, 1, 1, 20 );
93 return MENU_OK;
86} 94}
87 95
88static void wps_set(void) 96static Menu wps_set(void)
89{ 97{
90#ifdef HAVE_LCD_BITMAP 98#ifdef HAVE_LCD_BITMAP
91 char* names[] = { "ID3 Tags", "File ", "Parse " }; 99 char* names[] = { "ID3 Tags", "File ", "Parse " };
@@ -102,18 +110,20 @@ static void wps_set(void)
102#endif 110#endif
103 111
104#endif 112#endif
113 return MENU_OK;
105} 114}
106 115
107#ifdef HAVE_CHARGE_CTRL 116#ifdef HAVE_CHARGE_CTRL
108static void deep_discharge(void) 117static Menu deep_discharge(void)
109{ 118{
110 set_bool( "[Deep discharge]", &global_settings.discharge ); 119 set_bool( "[Deep discharge]", &global_settings.discharge );
111 charge_restart_level = global_settings.discharge ? CHARGE_RESTART_LO : CHARGE_RESTART_HI; 120 charge_restart_level = global_settings.discharge ? CHARGE_RESTART_LO : CHARGE_RESTART_HI;
121 return MENU_OK;
112} 122}
113#endif 123#endif
114 124
115#ifdef HAVE_RTC 125#ifdef HAVE_RTC
116static void timedate_set(void) 126static Menu timedate_set(void)
117{ 127{
118 int timedate[7]; /* hour,minute,second,year,month,day,dayofweek */ 128 int timedate[7]; /* hour,minute,second,year,month,day,dayofweek */
119 129
@@ -150,24 +160,28 @@ static void timedate_set(void)
150 rtc_write(0x04, timedate[6] | (rtc_read(0x04) & 0xf8)); /* dayofweek */ 160 rtc_write(0x04, timedate[6] | (rtc_read(0x04) & 0xf8)); /* dayofweek */
151 rtc_write(0x00, 0x00); /* 0.1 + 0.01 seconds */ 161 rtc_write(0x00, 0x00); /* 0.1 + 0.01 seconds */
152 } 162 }
163 return MENU_OK;
153} 164}
154#endif 165#endif
155 166
156static void ff_rewind(void) 167static Menu ff_rewind(void)
157{ 168{
158 set_int("[FF/Rewind Step Size]", "s", &global_settings.ff_rewind, 169 set_int("[FF/Rewind Step Size]", "s", &global_settings.ff_rewind,
159 NULL, 1, 1, 999 ); 170 NULL, 1, 1, 999 );
171 return MENU_OK;
160} 172}
161 173
162void settings_menu(void) 174Menu settings_menu(void)
163{ 175{
164 int m; 176 int m;
177 Menu result;
178
165 struct menu_items items[] = { 179 struct menu_items items[] = {
166 { "Shuffle", shuffle }, 180 { "Shuffle", shuffle },
167 { "MP3/M3U filter", mp3_filter }, 181 { "MP3/M3U filter", mp3_filter },
168 { "Sort mode", sort_case }, 182 { "Sort mode", sort_case },
169 { "Backlight Timer", backlight_timer }, 183 { "Backlight Timer", backlight_timer },
170 { "Contrast", contrast }, 184 { "Contrast", contrast },
171 { "Scroll speed", scroll_speed }, 185 { "Scroll speed", scroll_speed },
172 { "While Playing", wps_set }, 186 { "While Playing", wps_set },
173#ifdef HAVE_CHARGE_CTRL 187#ifdef HAVE_CHARGE_CTRL
@@ -183,7 +197,7 @@ void settings_menu(void)
183 bool old_shuffle = global_settings.playlist_shuffle; 197 bool old_shuffle = global_settings.playlist_shuffle;
184 198
185 m=menu_init( items, sizeof items / sizeof(struct menu_items) ); 199 m=menu_init( items, sizeof items / sizeof(struct menu_items) );
186 menu_run(m); 200 result = menu_run(m);
187 menu_exit(m); 201 menu_exit(m);
188 202
189 if (old_shuffle != global_settings.playlist_shuffle) 203 if (old_shuffle != global_settings.playlist_shuffle)
@@ -197,4 +211,5 @@ void settings_menu(void)
197 sort_playlist(); 211 sort_playlist();
198 } 212 }
199 } 213 }
214 return result;
200} 215}
diff --git a/apps/settings_menu.h b/apps/settings_menu.h
index 00227c08fa..19cffaccae 100644
--- a/apps/settings_menu.h
+++ b/apps/settings_menu.h
@@ -19,6 +19,8 @@
19#ifndef _SETTINGS_MENU_H 19#ifndef _SETTINGS_MENU_H
20#define _SETTINGS_MENU_H 20#define _SETTINGS_MENU_H
21 21
22void settings_menu(void); 22#include "menu.h"
23
24Menu settings_menu(void);
23 25
24#endif 26#endif
diff --git a/apps/sound_menu.c b/apps/sound_menu.c
index 63873ff0f8..24da3f5555 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -145,48 +145,56 @@ void set_sound(char* string,
145 lcd_stop_scroll(); 145 lcd_stop_scroll();
146} 146}
147 147
148static void volume(void) 148static Menu volume(void)
149{ 149{
150 set_sound("Volume", &global_settings.volume, SOUND_VOLUME); 150 set_sound("Volume", &global_settings.volume, SOUND_VOLUME);
151 return MENU_OK;
151} 152}
152 153
153static void balance(void) 154static Menu balance(void)
154{ 155{
155 set_sound("Balance", &global_settings.balance, SOUND_BALANCE); 156 set_sound("Balance", &global_settings.balance, SOUND_BALANCE);
157 return MENU_OK;
156} 158}
157 159
158static void bass(void) 160static Menu bass(void)
159{ 161{
160 set_sound("Bass", &global_settings.bass, SOUND_BASS); 162 set_sound("Bass", &global_settings.bass, SOUND_BASS);
163 return MENU_OK;
161}; 164};
162 165
163static void treble(void) 166static Menu treble(void)
164{ 167{
165 set_sound("Treble", &global_settings.treble, SOUND_TREBLE); 168 set_sound("Treble", &global_settings.treble, SOUND_TREBLE);
169 return MENU_OK;
166} 170}
167 171
168#ifdef HAVE_MAS3587F 172#ifdef HAVE_MAS3587F
169static void loudness(void) 173static Menu loudness(void)
170{ 174{
171 set_sound("Loudness", &global_settings.loudness, SOUND_LOUDNESS); 175 set_sound("Loudness", &global_settings.loudness, SOUND_LOUDNESS);
176 return MENU_OK;
172}; 177};
173 178
174static void bass_boost(void) 179static Menu bass_boost(void)
175{ 180{
176 set_sound("Bass boost", &global_settings.bass_boost, SOUND_SUPERBASS); 181 set_sound("Bass boost", &global_settings.bass_boost, SOUND_SUPERBASS);
182 return MENU_OK;
177}; 183};
178 184
179static void avc(void) 185static Menu avc(void)
180{ 186{
181 char* names[] = { "off", "2s ", "4s ", "8s " }; 187 char* names[] = { "off", "2s ", "4s ", "8s " };
182 set_option("[AV decay time]", &global_settings.avc, names, 4 ); 188 set_option("[AV decay time]", &global_settings.avc, names, 4 );
183 mpeg_sound_set(SOUND_AVC, global_settings.avc); 189 mpeg_sound_set(SOUND_AVC, global_settings.avc);
190 return MENU_OK;
184} 191}
185#endif /* ARCHOS_RECORDER */ 192#endif /* ARCHOS_RECORDER */
186 193
187void sound_menu(void) 194Menu sound_menu(void)
188{ 195{
189 int m; 196 int m;
197 Menu result;
190 struct menu_items items[] = { 198 struct menu_items items[] = {
191 { "Volume", volume }, 199 { "Volume", volume },
192 { "Bass", bass }, 200 { "Bass", bass },
@@ -200,6 +208,8 @@ void sound_menu(void)
200 }; 208 };
201 209
202 m=menu_init( items, sizeof items / sizeof(struct menu_items) ); 210 m=menu_init( items, sizeof items / sizeof(struct menu_items) );
203 menu_run(m); 211 result = menu_run(m);
204 menu_exit(m); 212 menu_exit(m);
213
214 return result;
205} 215}
diff --git a/apps/sound_menu.h b/apps/sound_menu.h
index db40c120aa..27e9c5efa3 100644
--- a/apps/sound_menu.h
+++ b/apps/sound_menu.h
@@ -19,6 +19,8 @@
19#ifndef _SOUND_MENU_H 19#ifndef _SOUND_MENU_H
20#define _SOUND_MENU_H 20#define _SOUND_MENU_H
21 21
22void sound_menu(void); 22#include "menu.h"
23
24Menu sound_menu(void);
23 25
24#endif 26#endif
diff --git a/apps/tree.c b/apps/tree.c
index 8718252ac5..0c4e26ab8e 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -640,13 +640,15 @@ bool dirbrowse(char *root)
640 bool lastfilter = global_settings.mp3filter; 640 bool lastfilter = global_settings.mp3filter;
641 bool lastsortcase = global_settings.sort_case; 641 bool lastsortcase = global_settings.sort_case;
642 bool show_hidden_files = global_settings.show_hidden_files; 642 bool show_hidden_files = global_settings.show_hidden_files;
643 Menu result;
643 644
644 lcd_stop_scroll(); 645 lcd_stop_scroll();
645 main_menu(); 646 result = main_menu();
646 /* do we need to rescan dir? */ 647 /* do we need to rescan dir? */
647 if ( lastfilter != global_settings.mp3filter || 648 if (result == MENU_REFRESH_DIR ||
648 lastsortcase != global_settings.sort_case || 649 lastfilter != global_settings.mp3filter ||
649 show_hidden_files != global_settings.show_hidden_files) 650 lastsortcase != global_settings.sort_case ||
651 show_hidden_files != global_settings.show_hidden_files)
650 lastdir[0] = 0; 652 lastdir[0] = 0;
651 restore = true; 653 restore = true;
652 break; 654 break;