summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/alarm_menu.c1
-rw-r--r--apps/appevents.h1
-rw-r--r--apps/bookmark.c3
-rw-r--r--apps/debug_menu.c48
-rw-r--r--apps/enc_config.c1
-rw-r--r--apps/gui/bitmap/list.c211
-rw-r--r--apps/gui/charcell/list.c4
-rw-r--r--apps/gui/gwps-common.c12
-rw-r--r--apps/gui/list.c57
-rw-r--r--apps/gui/list.h2
-rw-r--r--apps/gui/option_select.c2
-rw-r--r--apps/gui/pitchscreen.c1
-rw-r--r--apps/gui/quickscreen.c3
-rw-r--r--apps/gui/statusbar.c6
-rw-r--r--apps/gui/statusbar.h2
-rw-r--r--apps/gui/viewport.c33
-rw-r--r--apps/gui/viewport.h6
-rw-r--r--apps/gui/yesno.c2
-rw-r--r--apps/main.c14
-rw-r--r--apps/menu.c61
-rw-r--r--apps/menus/main_menu.c3
-rw-r--r--apps/menus/recording_menu.c1
-rw-r--r--apps/menus/time_menu.c2
-rw-r--r--apps/misc.c5
-rw-r--r--apps/onplay.c1
-rw-r--r--apps/playlist_catalog.c4
-rw-r--r--apps/playlist_viewer.c5
-rw-r--r--apps/plugin.c4
-rw-r--r--apps/plugin.h7
-rw-r--r--apps/plugins/calendar.c1
-rw-r--r--apps/plugins/chessbox/chessbox_pgn.c1
-rw-r--r--apps/plugins/keybox.c1
-rw-r--r--apps/plugins/lib/oldmenuapi.c3
-rw-r--r--apps/plugins/shortcuts/shortcuts_view.c2
-rw-r--r--apps/plugins/star.c4
-rw-r--r--apps/plugins/zxbox/zxbox_keyb.c6
-rw-r--r--apps/recorder/keyboard.c2
-rw-r--r--apps/recorder/radio.c5
-rw-r--r--apps/recorder/recording.c5
-rw-r--r--apps/root_menu.c4
-rw-r--r--apps/screens.c6
-rw-r--r--apps/settings.c4
-rw-r--r--apps/settings_list.c3
-rw-r--r--apps/tree.c7
-rw-r--r--firmware/drivers/button.c1
-rw-r--r--firmware/export/kernel.h1
46 files changed, 294 insertions, 264 deletions
diff --git a/apps/alarm_menu.c b/apps/alarm_menu.c
index bc058b7251..3c3ed3de39 100644
--- a/apps/alarm_menu.c
+++ b/apps/alarm_menu.c
@@ -193,7 +193,6 @@ bool alarm_screen(void)
193 break; 193 break;
194 194
195 case ACTION_NONE: 195 case ACTION_NONE:
196 gui_syncstatusbar_draw(&statusbars, false);
197 hour_wrapped = false; 196 hour_wrapped = false;
198 break; 197 break;
199 198
diff --git a/apps/appevents.h b/apps/appevents.h
index 36990f9768..48d578de25 100644
--- a/apps/appevents.h
+++ b/apps/appevents.h
@@ -49,6 +49,7 @@ enum {
49enum { 49enum {
50 GUI_EVENT_THEME_CHANGED = (EVENT_CLASS_GUI|1), 50 GUI_EVENT_THEME_CHANGED = (EVENT_CLASS_GUI|1),
51 GUI_EVENT_STATUSBAR_TOGGLE, 51 GUI_EVENT_STATUSBAR_TOGGLE,
52 GUI_EVENT_FOURHERTZ,
52}; 53};
53 54
54#endif 55#endif
diff --git a/apps/bookmark.c b/apps/bookmark.c
index 524de5aff4..52599519a3 100644
--- a/apps/bookmark.c
+++ b/apps/bookmark.c
@@ -198,7 +198,6 @@ bool bookmark_autobookmark(void)
198#if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 198#if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
199 show_remote_main_backdrop(); 199 show_remote_main_backdrop();
200#endif 200#endif
201 gui_syncstatusbar_draw(&statusbars, false);
202 if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES) 201 if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES)
203 { 202 {
204 if (global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_ASK) 203 if (global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_ASK)
@@ -680,11 +679,9 @@ static char* select_bookmark(const char* bookmark_file_name, bool show_dont_resu
680 gui_synclist_set_voice_callback(&list, bookmark_list_voice_cb); 679 gui_synclist_set_voice_callback(&list, bookmark_list_voice_cb);
681 gui_synclist_set_title(&list, str(LANG_BOOKMARK_SELECT_BOOKMARK), 680 gui_synclist_set_title(&list, str(LANG_BOOKMARK_SELECT_BOOKMARK),
682 Icon_Bookmark); 681 Icon_Bookmark);
683 gui_syncstatusbar_draw(&statusbars, true);
684 682
685 while (!exit) 683 while (!exit)
686 { 684 {
687 gui_syncstatusbar_draw(&statusbars, false);
688 685
689 if (refresh) 686 if (refresh)
690 { 687 {
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 8878e29c3a..92eb245249 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -47,6 +47,7 @@
47#include "misc.h" 47#include "misc.h"
48#include "splash.h" 48#include "splash.h"
49#include "dircache.h" 49#include "dircache.h"
50#include "viewport.h"
50#ifdef HAVE_TAGCACHE 51#ifdef HAVE_TAGCACHE
51#include "tagcache.h" 52#include "tagcache.h"
52#endif 53#endif
@@ -232,6 +233,7 @@ static bool dbg_audio_thread(void)
232 struct audio_debug d; 233 struct audio_debug d;
233 234
234 lcd_setfont(FONT_SYSFIXED); 235 lcd_setfont(FONT_SYSFIXED);
236 viewportmanager_set_statusbar(false);
235 237
236 while(1) 238 while(1)
237 { 239 {
@@ -269,6 +271,7 @@ static bool dbg_audio_thread(void)
269 271
270 lcd_update(); 272 lcd_update();
271 } 273 }
274 viewportmanager_set_statusbar(true);
272 return false; 275 return false;
273} 276}
274#endif /* !SIMULATOR */ 277#endif /* !SIMULATOR */
@@ -304,6 +307,7 @@ static bool dbg_buffering_thread(void)
304 tick_add_task(dbg_audio_task); 307 tick_add_task(dbg_audio_task);
305 308
306 lcd_setfont(FONT_SYSFIXED); 309 lcd_setfont(FONT_SYSFIXED);
310 viewportmanager_set_statusbar(false);
307 while(!done) 311 while(!done)
308 { 312 {
309 button = get_action(CONTEXT_STD,HZ/5); 313 button = get_action(CONTEXT_STD,HZ/5);
@@ -394,6 +398,7 @@ static bool dbg_buffering_thread(void)
394 } 398 }
395 399
396 tick_remove_task(dbg_audio_task); 400 tick_remove_task(dbg_audio_task);
401 viewportmanager_set_statusbar(true);
397 402
398 return false; 403 return false;
399} 404}
@@ -526,6 +531,7 @@ static bool dbg_hw_info(void)
526 531
527 lcd_setfont(FONT_SYSFIXED); 532 lcd_setfont(FONT_SYSFIXED);
528 lcd_clear_display(); 533 lcd_clear_display();
534 viewportmanager_set_statusbar(false);
529 535
530 lcd_puts(0, 0, "[Hardware info]"); 536 lcd_puts(0, 0, "[Hardware info]");
531 537
@@ -564,6 +570,7 @@ static bool dbg_hw_info(void)
564 int got_id; /* flag if we managed to get the flash IDs */ 570 int got_id; /* flag if we managed to get the flash IDs */
565 int oldmode; /* saved memory guard mode */ 571 int oldmode; /* saved memory guard mode */
566 int line = 0; 572 int line = 0;
573 viewportmanager_set_statusbar(false);
567 574
568 oldmode = system_memory_guard(MEMGUARD_NONE); /* disable memory guard */ 575 oldmode = system_memory_guard(MEMGUARD_NONE); /* disable memory guard */
569 576
@@ -626,6 +633,7 @@ static bool dbg_hw_info(void)
626 633
627 lcd_setfont(FONT_SYSFIXED); 634 lcd_setfont(FONT_SYSFIXED);
628 lcd_clear_display(); 635 lcd_clear_display();
636 viewportmanager_set_statusbar(false);
629 637
630 lcd_puts(0, line++, "[Hardware info]"); 638 lcd_puts(0, line++, "[Hardware info]");
631 639
@@ -679,10 +687,12 @@ static bool dbg_hw_info(void)
679 lcd_update(); 687 lcd_update();
680 688
681 while (!(action_userabort(TIMEOUT_BLOCK))); 689 while (!(action_userabort(TIMEOUT_BLOCK)));
690
682#else 691#else
683 /* Define this function in your target tree */ 692 /* Define this function in your target tree */
684 return __dbg_hw_info(); 693 return __dbg_hw_info();
685#endif /* CONFIG_CPU */ 694#endif /* CONFIG_CPU */
695 viewportmanager_set_statusbar(true);
686 return false; 696 return false;
687} 697}
688#else /* !HAVE_LCD_BITMAP */ 698#else /* !HAVE_LCD_BITMAP */
@@ -824,6 +834,7 @@ static bool dbg_spdif(void)
824 834
825 lcd_clear_display(); 835 lcd_clear_display();
826 lcd_setfont(FONT_SYSFIXED); 836 lcd_setfont(FONT_SYSFIXED);
837 viewportmanager_set_statusbar(false);
827 838
828#ifdef HAVE_SPDIF_POWER 839#ifdef HAVE_SPDIF_POWER
829 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */ 840 spdif_power_enable(true); /* We need SPDIF power for both sending & receiving */
@@ -976,6 +987,7 @@ static bool dbg_spdif(void)
976 spdif_power_enable(global_settings.spdif_enable); 987 spdif_power_enable(global_settings.spdif_enable);
977#endif 988#endif
978 989
990 viewportmanager_set_statusbar(true);
979 return false; 991 return false;
980} 992}
981#endif /* CPU_COLDFIRE */ 993#endif /* CPU_COLDFIRE */
@@ -1033,6 +1045,7 @@ bool dbg_ports(void)
1033 1045
1034 lcd_setfont(FONT_SYSFIXED); 1046 lcd_setfont(FONT_SYSFIXED);
1035 lcd_clear_display(); 1047 lcd_clear_display();
1048 viewportmanager_set_statusbar(false);
1036 1049
1037 while(1) 1050 while(1)
1038 { 1051 {
@@ -1057,7 +1070,10 @@ bool dbg_ports(void)
1057 1070
1058 lcd_update(); 1071 lcd_update();
1059 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) 1072 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
1073 {
1074 viewportmanager_set_statusbar(true);
1060 return false; 1075 return false;
1076 }
1061 } 1077 }
1062#elif defined(CPU_COLDFIRE) 1078#elif defined(CPU_COLDFIRE)
1063 unsigned int gpio_out; 1079 unsigned int gpio_out;
@@ -1075,6 +1091,7 @@ bool dbg_ports(void)
1075 1091
1076 lcd_clear_display(); 1092 lcd_clear_display();
1077 lcd_setfont(FONT_SYSFIXED); 1093 lcd_setfont(FONT_SYSFIXED);
1094 viewportmanager_set_statusbar(false);
1078 1095
1079 while(1) 1096 while(1)
1080 { 1097 {
@@ -1140,7 +1157,10 @@ bool dbg_ports(void)
1140 1157
1141 lcd_update(); 1158 lcd_update();
1142 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) 1159 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
1160 {
1161 viewportmanager_set_statusbar(true);
1143 return false; 1162 return false;
1163 }
1144 } 1164 }
1145 1165
1146#elif defined(CPU_PP502x) 1166#elif defined(CPU_PP502x)
@@ -1150,6 +1170,7 @@ bool dbg_ports(void)
1150 1170
1151 lcd_clear_display(); 1171 lcd_clear_display();
1152 lcd_setfont(FONT_SYSFIXED); 1172 lcd_setfont(FONT_SYSFIXED);
1173 viewportmanager_set_statusbar(false);
1153 1174
1154 while(1) 1175 while(1)
1155 { 1176 {
@@ -1247,7 +1268,10 @@ extern unsigned char serbuf[];
1247#endif 1268#endif
1248 lcd_update(); 1269 lcd_update();
1249 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) 1270 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
1271 {
1272 viewportmanager_set_statusbar(true);
1250 return false; 1273 return false;
1274 }
1251 } 1275 }
1252 1276
1253#elif CONFIG_CPU == PP5002 1277#elif CONFIG_CPU == PP5002
@@ -1256,6 +1280,7 @@ extern unsigned char serbuf[];
1256 1280
1257 lcd_clear_display(); 1281 lcd_clear_display();
1258 lcd_setfont(FONT_SYSFIXED); 1282 lcd_setfont(FONT_SYSFIXED);
1283 viewportmanager_set_statusbar(false);
1259 1284
1260 while(1) 1285 while(1)
1261 { 1286 {
@@ -1286,8 +1311,12 @@ extern unsigned char serbuf[];
1286 1311
1287 lcd_update(); 1312 lcd_update();
1288 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) 1313 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
1314 {
1315 viewportmanager_set_statusbar(true);
1289 return false; 1316 return false;
1317 }
1290 } 1318 }
1319 viewportmanager_set_statusbar(true);
1291#else 1320#else
1292 return __dbg_ports(); 1321 return __dbg_ports();
1293#endif /* CPU */ 1322#endif /* CPU */
@@ -1302,6 +1331,7 @@ bool dbg_ports(void)
1302 int currval = 0; 1331 int currval = 0;
1303 1332
1304 lcd_clear_display(); 1333 lcd_clear_display();
1334 viewportmanager_set_statusbar(false);
1305 1335
1306 while(1) 1336 while(1)
1307 { 1337 {
@@ -1337,7 +1367,6 @@ bool dbg_ports(void)
1337 case 9: 1367 case 9:
1338 snprintf(buf, 32, "AN7: %03x", adc_read(7)); 1368 snprintf(buf, 32, "AN7: %03x", adc_read(7));
1339 break; 1369 break;
1340 break;
1341 } 1370 }
1342 lcd_puts(0, 0, buf); 1371 lcd_puts(0, 0, buf);
1343 1372
@@ -1367,6 +1396,7 @@ bool dbg_ports(void)
1367 break; 1396 break;
1368 } 1397 }
1369 } 1398 }
1399 viewportmanager_set_statusbar(true);
1370 return false; 1400 return false;
1371} 1401}
1372#endif /* !HAVE_LCD_BITMAP */ 1402#endif /* !HAVE_LCD_BITMAP */
@@ -1382,6 +1412,7 @@ static bool dbg_pcf(void)
1382 lcd_setfont(FONT_SYSFIXED); 1412 lcd_setfont(FONT_SYSFIXED);
1383#endif 1413#endif
1384 lcd_clear_display(); 1414 lcd_clear_display();
1415 viewportmanager_set_statusbar(false);
1385 1416
1386 while(1) 1417 while(1)
1387 { 1418 {
@@ -1417,10 +1448,12 @@ static bool dbg_pcf(void)
1417 lcd_update(); 1448 lcd_update();
1418 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL)) 1449 if (button_get_w_tmo(HZ/10) == (DEBUG_CANCEL|BUTTON_REL))
1419 { 1450 {
1451 viewportmanager_set_statusbar(true);
1420 return false; 1452 return false;
1421 } 1453 }
1422 } 1454 }
1423 1455
1456 viewportmanager_set_statusbar(true);
1424 return false; 1457 return false;
1425} 1458}
1426#endif 1459#endif
@@ -1436,6 +1469,7 @@ static bool dbg_cpufreq(void)
1436 lcd_setfont(FONT_SYSFIXED); 1469 lcd_setfont(FONT_SYSFIXED);
1437#endif 1470#endif
1438 lcd_clear_display(); 1471 lcd_clear_display();
1472 viewportmanager_set_statusbar(false);
1439 1473
1440 while(1) 1474 while(1)
1441 { 1475 {
@@ -1467,10 +1501,11 @@ static bool dbg_cpufreq(void)
1467 break; 1501 break;
1468 1502
1469 case ACTION_STD_CANCEL: 1503 case ACTION_STD_CANCEL:
1504 viewportmanager_set_statusbar(true);
1470 return false; 1505 return false;
1471 } 1506 }
1472 } 1507 }
1473 1508 viewportmanager_set_statusbar(true);
1474 return false; 1509 return false;
1475} 1510}
1476#endif /* HAVE_ADJUSTABLE_CPU_FREQ */ 1511#endif /* HAVE_ADJUSTABLE_CPU_FREQ */
@@ -1563,6 +1598,7 @@ static bool view_battery(void)
1563 char buf[32]; 1598 char buf[32];
1564 1599
1565 lcd_setfont(FONT_SYSFIXED); 1600 lcd_setfont(FONT_SYSFIXED);
1601 viewportmanager_set_statusbar(false);
1566 1602
1567 while(1) 1603 while(1)
1568 { 1604 {
@@ -1803,9 +1839,11 @@ static bool view_battery(void)
1803 break; 1839 break;
1804 1840
1805 case ACTION_STD_CANCEL: 1841 case ACTION_STD_CANCEL:
1842 viewportmanager_set_statusbar(true);
1806 return false; 1843 return false;
1807 } 1844 }
1808 } 1845 }
1846 viewportmanager_set_statusbar(true);
1809 return false; 1847 return false;
1810} 1848}
1811 1849
@@ -2434,6 +2472,7 @@ static bool cpu_boost_log(void)
2434 bool done; 2472 bool done;
2435 lcd_setfont(FONT_SYSFIXED); 2473 lcd_setfont(FONT_SYSFIXED);
2436 str = cpu_boost_log_getlog_first(); 2474 str = cpu_boost_log_getlog_first();
2475 viewportmanager_set_statusbar(false);
2437 while (i < count) 2476 while (i < count)
2438 { 2477 {
2439 lcd_clear_display(); 2478 lcd_clear_display();
@@ -2467,6 +2506,7 @@ static bool cpu_boost_log(void)
2467 } 2506 }
2468 get_action(CONTEXT_STD,TIMEOUT_BLOCK); 2507 get_action(CONTEXT_STD,TIMEOUT_BLOCK);
2469 lcd_setfont(FONT_UI); 2508 lcd_setfont(FONT_UI);
2509 viewportmanager_set_statusbar(true);
2470 return false; 2510 return false;
2471} 2511}
2472#endif 2512#endif
@@ -2485,11 +2525,12 @@ static bool dbg_scrollwheel(void)
2485 unsigned int speed; 2525 unsigned int speed;
2486 2526
2487 lcd_setfont(FONT_SYSFIXED); 2527 lcd_setfont(FONT_SYSFIXED);
2528 viewportmanager_set_statusbar(false);
2488 2529
2489 while (1) 2530 while (1)
2490 { 2531 {
2491 if (action_userabort(HZ/10)) 2532 if (action_userabort(HZ/10))
2492 return false; 2533 break;
2493 2534
2494 lcd_clear_display(); 2535 lcd_clear_display();
2495 2536
@@ -2514,6 +2555,7 @@ static bool dbg_scrollwheel(void)
2514 2555
2515 lcd_update(); 2556 lcd_update();
2516 } 2557 }
2558 viewportmanager_set_statusbar(true);
2517 return false; 2559 return false;
2518} 2560}
2519#endif 2561#endif
diff --git a/apps/enc_config.c b/apps/enc_config.c
index 2368c9e065..8f3237d2e6 100644
--- a/apps/enc_config.c
+++ b/apps/enc_config.c
@@ -295,7 +295,6 @@ static int enc_menuitem_callback(int action,
295 encoder_config_to_global(data->cfg); 295 encoder_config_to_global(data->cfg);
296 } 296 }
297 297
298 gui_syncstatusbar_draw(&statusbars, true);
299 } 298 }
300 return action; 299 return action;
301} 300}
diff --git a/apps/gui/bitmap/list.c b/apps/gui/bitmap/list.c
index a3f5da92ea..3b2f16db8c 100644
--- a/apps/gui/bitmap/list.c
+++ b/apps/gui/bitmap/list.c
@@ -45,19 +45,13 @@
45#define SCROLLBAR_WIDTH 6 45#define SCROLLBAR_WIDTH 6
46#define ICON_PADDING 1 46#define ICON_PADDING 1
47 47
48static struct viewport title_text[NB_SCREENS], title_icons[NB_SCREENS], 48/* these are static to make scrolling work */
49 list_text[NB_SCREENS], list_icons[NB_SCREENS]; 49static struct viewport list_text[NB_SCREENS], title_text[NB_SCREENS];
50 50
51/* should probably be moved somewhere else */
52int list_title_height(struct gui_synclist *list, struct viewport *vp)
53{
54 (void)list;
55 return font_get(vp->font)->height;
56}
57int gui_list_get_item_offset(struct gui_synclist * gui_list, int item_width, 51int gui_list_get_item_offset(struct gui_synclist * gui_list, int item_width,
58 int text_pos, struct screen * display, 52 int text_pos, struct screen * display,
59 struct viewport *vp); 53 struct viewport *vp);
60bool list_display_title(struct gui_synclist *list, struct viewport *vp); 54bool list_display_title(struct gui_synclist *list, enum screen_type screen);
61 55
62/* Draw the list... 56/* Draw the list...
63 internal screen layout: 57 internal screen layout:
@@ -70,47 +64,51 @@ bool list_display_title(struct gui_synclist *list, struct viewport *vp);
70 | | | | 64 | | | |
71 ------------------ 65 ------------------
72*/ 66*/
73static bool draw_title(struct screen *display, struct viewport *parent, 67static bool draw_title(struct screen *display, struct gui_synclist *list)
74 struct gui_synclist *list)
75{ 68{
76 struct viewport *vp_icons = &title_icons[display->screen_type]; 69 const int screen = display->screen_type;
77 struct viewport *vp_text = &title_text[display->screen_type]; 70 if (!list_display_title(list, screen))
78 if (!list_display_title(list, parent))
79 return false; 71 return false;
80 *vp_text = *parent; 72 title_text[screen] = *(list->parent[screen]);
81 vp_text->height = list_title_height(list, parent); 73 title_text[screen].height
74 = font_get(title_text[screen].font)->height;
82 if (list->title_icon != Icon_NOICON && global_settings.show_icons) 75 if (list->title_icon != Icon_NOICON && global_settings.show_icons)
83 { 76 {
84 *vp_icons = *vp_text; 77 struct viewport title_icon = *(list->parent[screen]);
85 vp_icons->width = get_icon_width(display->screen_type) 78 title_icon = title_text[screen];
79 title_icon.width = get_icon_width(screen)
86 + ICON_PADDING*2; 80 + ICON_PADDING*2;
87 vp_icons->x += ICON_PADDING; 81 title_icon.x += ICON_PADDING;
88 82
89 vp_text->width -= vp_icons->width + vp_icons->x; 83 title_text[screen].width -= title_icon.width + title_icon.x;
90 vp_text->x += vp_icons->width + vp_icons->x; 84 title_text[screen].x += title_icon.width + title_icon.x;
91 85
92 display->set_viewport(vp_icons); 86 display->set_viewport(&title_icon);
93 screen_put_icon(display, 0, 0, list->title_icon); 87 screen_put_icon(display, 0, 0, list->title_icon);
94 } 88 }
95 display->set_viewport(vp_text); 89 title_text[screen].drawmode = STYLE_DEFAULT;
96 vp_text->drawmode = STYLE_DEFAULT;
97#ifdef HAVE_LCD_COLOR 90#ifdef HAVE_LCD_COLOR
98 if (list->title_color >= 0) 91 if (list->title_color >= 0)
99 { 92 {
100 vp_text->drawmode |= (STYLE_COLORED|list->title_color);} 93 title_text[screen].drawmode
94 |= (STYLE_COLORED|list->title_color);
95 }
101#endif 96#endif
102 display->puts_scroll_style_offset(0, 0, list->title, 97 display->set_viewport(&title_text[screen]);
103 vp_text->drawmode, 0); 98 display->puts_scroll_style(0, 0, list->title,
99 title_text[screen].drawmode);
104 return true; 100 return true;
105} 101}
106 102
107void list_draw(struct screen *display, struct viewport *parent, 103void list_draw(struct screen *display, struct gui_synclist *list)
108 struct gui_synclist *list)
109{ 104{
105 struct viewport list_icons;
110 int start, end, line_height, i; 106 int start, end, line_height, i;
111 int icon_width = get_icon_width(display->screen_type) + ICON_PADDING; 107 const int screen = display->screen_type;
112 bool show_cursor = !global_settings.cursor_style && 108 const int icon_width = get_icon_width(screen) + ICON_PADDING;
109 const bool show_cursor = !global_settings.cursor_style &&
113 list->show_selection_marker; 110 list->show_selection_marker;
111 struct viewport *parent = (list->parent[screen]);
114#ifdef HAVE_LCD_COLOR 112#ifdef HAVE_LCD_COLOR
115 unsigned char cur_line = 0; 113 unsigned char cur_line = 0;
116#endif 114#endif
@@ -120,55 +118,55 @@ void list_draw(struct screen *display, struct viewport *parent,
120 display->set_viewport(parent); 118 display->set_viewport(parent);
121 display->clear_viewport(); 119 display->clear_viewport();
122 display->stop_scroll(); 120 display->stop_scroll();
123 list_text[display->screen_type] = *parent; 121 list_text[screen] = *parent;
124 if ((show_title = draw_title(display, parent, list))) 122 if ((show_title = draw_title(display, list)))
125 { 123 {
126 list_text[display->screen_type].y += list_title_height(list, parent); 124 list_text[screen].y += line_height;
127 list_text[display->screen_type].height -= list_title_height(list, parent); 125 list_text[screen].height -= line_height;
128 } 126 }
129 127
130 start = list->start_item[display->screen_type]; 128 start = list->start_item[screen];
131 end = start + viewport_get_nb_lines(&list_text[display->screen_type]); 129 end = start + viewport_get_nb_lines(&list_text[screen]);
132 130
133 /* draw the scrollbar if its needed */ 131 /* draw the scrollbar if its needed */
134 if (global_settings.scrollbar && 132 if (global_settings.scrollbar &&
135 viewport_get_nb_lines(&list_text[display->screen_type]) < list->nb_items) 133 viewport_get_nb_lines(&list_text[screen]) < list->nb_items)
136 { 134 {
137 struct viewport vp; 135 struct viewport vp;
138 vp = list_text[display->screen_type]; 136 vp = list_text[screen];
139 vp.width = SCROLLBAR_WIDTH; 137 vp.width = SCROLLBAR_WIDTH;
140 list_text[display->screen_type].width -= SCROLLBAR_WIDTH; 138 list_text[screen].width -= SCROLLBAR_WIDTH;
141 list_text[display->screen_type].x += SCROLLBAR_WIDTH; 139 list_text[screen].x += SCROLLBAR_WIDTH;
142 vp.height = line_height * 140 vp.height = line_height *
143 viewport_get_nb_lines(&list_text[display->screen_type]); 141 viewport_get_nb_lines(&list_text[screen]);
144 vp.x = parent->x; 142 vp.x = parent->x;
145 display->set_viewport(&vp); 143 display->set_viewport(&vp);
146 gui_scrollbar_draw(display, 0, 0, SCROLLBAR_WIDTH-1, 144 gui_scrollbar_draw(display, 0, 0, SCROLLBAR_WIDTH-1,
147 vp.height, list->nb_items, 145 vp.height, list->nb_items,
148 list->start_item[display->screen_type], 146 list->start_item[screen],
149 list->start_item[display->screen_type] + end-start, 147 list->start_item[screen] + end-start,
150 VERTICAL); 148 VERTICAL);
151 } 149 }
152 else if (show_title) 150 else if (show_title)
153 { 151 {
154 /* shift everything right a bit... */ 152 /* shift everything right a bit... */
155 list_text[display->screen_type].width -= SCROLLBAR_WIDTH; 153 list_text[screen].width -= SCROLLBAR_WIDTH;
156 list_text[display->screen_type].x += SCROLLBAR_WIDTH; 154 list_text[screen].x += SCROLLBAR_WIDTH;
157 } 155 }
158 156
159 /* setup icon placement */ 157 /* setup icon placement */
160 list_icons[display->screen_type] = list_text[display->screen_type]; 158 list_icons = list_text[screen];
161 int icon_count = global_settings.show_icons && 159 int icon_count = global_settings.show_icons &&
162 (list->callback_get_item_icon != NULL) ? 1 : 0; 160 (list->callback_get_item_icon != NULL) ? 1 : 0;
163 if (show_cursor) 161 if (show_cursor)
164 icon_count++; 162 icon_count++;
165 if (icon_count) 163 if (icon_count)
166 { 164 {
167 list_icons[display->screen_type].width = icon_width * icon_count; 165 list_icons.width = icon_width * icon_count;
168 list_text[display->screen_type].width -= 166 list_text[screen].width -=
169 list_icons[display->screen_type].width + ICON_PADDING; 167 list_icons.width + ICON_PADDING;
170 list_text[display->screen_type].x += 168 list_text[screen].x +=
171 list_icons[display->screen_type].width + ICON_PADDING; 169 list_icons.width + ICON_PADDING;
172 } 170 }
173 171
174 for (i=start; i<end && i<list->nb_items; i++) 172 for (i=start; i<end && i<list->nb_items; i++)
@@ -181,14 +179,14 @@ void list_draw(struct screen *display, struct viewport *parent,
181 s = list->callback_get_item_name(i, list->data, entry_buffer, 179 s = list->callback_get_item_name(i, list->data, entry_buffer,
182 sizeof(entry_buffer)); 180 sizeof(entry_buffer));
183 entry_name = P2STR(s); 181 entry_name = P2STR(s);
184 display->set_viewport(&list_text[display->screen_type]); 182 display->set_viewport(&list_text[screen]);
185 list_text[display->screen_type].drawmode = STYLE_DEFAULT; 183 list_text[screen].drawmode = STYLE_DEFAULT;
186 /* position the string at the correct offset place */ 184 /* position the string at the correct offset place */
187 int item_width,h; 185 int item_width,h;
188 display->getstringsize(entry_name, &item_width, &h); 186 display->getstringsize(entry_name, &item_width, &h);
189 item_offset = gui_list_get_item_offset(list, item_width, 187 item_offset = gui_list_get_item_offset(list, item_width,
190 text_pos, display, 188 text_pos, display,
191 &list_text[display->screen_type]); 189 &list_text[screen]);
192 190
193#ifdef HAVE_LCD_COLOR 191#ifdef HAVE_LCD_COLOR
194 /* if the list has a color callback */ 192 /* if the list has a color callback */
@@ -198,73 +196,75 @@ void list_draw(struct screen *display, struct viewport *parent,
198 /* if color selected */ 196 /* if color selected */
199 if (color >= 0) 197 if (color >= 0)
200 { 198 {
201 list_text[display->screen_type].drawmode |= STYLE_COLORED|color; 199 list_text[screen].drawmode |= STYLE_COLORED|color;
202 } 200 }
203 } 201 }
204#endif 202#endif
205 if(i >= list->selected_item && 203 if(i >= list->selected_item && i < list->selected_item
206 i < list->selected_item + list->selected_size && list->show_selection_marker) 204 + list->selected_size && list->show_selection_marker)
207 {/* The selected item must be displayed scrolling */ 205 {/* The selected item must be displayed scrolling */
208 if (global_settings.cursor_style == 1 206 if (global_settings.cursor_style == 1
209#ifdef HAVE_REMOTE_LCD 207#ifdef HAVE_REMOTE_LCD
210 /* the global_settings.cursor_style check is here to make sure 208 /* the global_settings.cursor_style check is here to make
211 if they want the cursor instead of bar it will work */ 209 * sure if they want the cursor instead of bar it will work
210 */
212 || (display->depth < 16 && global_settings.cursor_style) 211 || (display->depth < 16 && global_settings.cursor_style)
213#endif 212#endif
214 ) 213 )
215 { 214 {
216 /* Display inverted-line-style */ 215 /* Display inverted-line-style */
217 list_text[display->screen_type].drawmode = STYLE_INVERT; 216 list_text[screen].drawmode = STYLE_INVERT;
218 } 217 }
219#ifdef HAVE_LCD_COLOR 218#ifdef HAVE_LCD_COLOR
220 else if (global_settings.cursor_style == 2) 219 else if (global_settings.cursor_style == 2)
221 { 220 {
222 /* Display colour line selector */ 221 /* Display colour line selector */
223 list_text[display->screen_type].drawmode = STYLE_COLORBAR; 222 list_text[screen].drawmode = STYLE_COLORBAR;
224 } 223 }
225 else if (global_settings.cursor_style == 3) 224 else if (global_settings.cursor_style == 3)
226 { 225 {
227 /* Display gradient line selector */ 226 /* Display gradient line selector */
228 list_text[display->screen_type].drawmode = STYLE_GRADIENT; 227 list_text[screen].drawmode = STYLE_GRADIENT;
229 228
230 /* Make the lcd driver know how many lines the gradient should 229 /* Make the lcd driver know how many lines the gradient should
231 cover and current line number */ 230 cover and current line number */
232 /* number of selected lines */ 231 /* number of selected lines */
233 list_text[display->screen_type].drawmode |= NUMLN_PACK(list->selected_size); 232 list_text[screen].drawmode |= NUMLN_PACK(list->selected_size);
234 /* current line number, zero based */ 233 /* current line number, zero based */
235 list_text[display->screen_type].drawmode |= CURLN_PACK(cur_line); 234 list_text[screen].drawmode |= CURLN_PACK(cur_line);
236 cur_line++; 235 cur_line++;
237 } 236 }
238#endif 237#endif
239 /* if the text is smaller than the viewport size */ 238 /* if the text is smaller than the viewport size */
240 if (item_offset > item_width - (list_text[display->screen_type].width - text_pos)) 239 if (item_offset> item_width
240 - (list_text[screen].width - text_pos))
241 { 241 {
242 /* don't scroll */ 242 /* don't scroll */
243 display->puts_style_offset(0, i-start, entry_name, 243 display->puts_style_offset(0, i-start, entry_name,
244 list_text[display->screen_type].drawmode, item_offset); 244 list_text[screen].drawmode, item_offset);
245 } 245 }
246 else 246 else
247 { 247 {
248 display->puts_scroll_style_offset(0, i-start, entry_name, 248 display->puts_scroll_style_offset(0, i-start, entry_name,
249 list_text[display->screen_type].drawmode, item_offset); 249 list_text[screen].drawmode, item_offset);
250 } 250 }
251 } 251 }
252 else 252 else
253 { 253 {
254 if (list->scroll_all) 254 if (list->scroll_all)
255 display->puts_scroll_style_offset(0, i-start, entry_name, 255 display->puts_scroll_style_offset(0, i-start, entry_name,
256 list_text[display->screen_type].drawmode, item_offset); 256 list_text[screen].drawmode, item_offset);
257 else 257 else
258 display->puts_style_offset(0, i-start, entry_name, 258 display->puts_style_offset(0, i-start, entry_name,
259 list_text[display->screen_type].drawmode, item_offset); 259 list_text[screen].drawmode, item_offset);
260 } 260 }
261 /* do the icon */ 261 /* do the icon */
262 if (list->callback_get_item_icon && global_settings.show_icons) 262 if (list->callback_get_item_icon && global_settings.show_icons)
263 { 263 {
264 display->set_viewport(&list_icons[display->screen_type]); 264 display->set_viewport(&list_icons);
265 screen_put_icon_with_offset(display, show_cursor?1:0, 265 screen_put_icon_with_offset(display, show_cursor?1:0,
266 (i-start),show_cursor?ICON_PADDING:0,0, 266 (i-start),show_cursor?ICON_PADDING:0,0,
267 list->callback_get_item_icon(i, list->data)); 267 list->callback_get_item_icon(i, list->data));
268 if (show_cursor && i >= list->selected_item && 268 if (show_cursor && i >= list->selected_item &&
269 i < list->selected_item + list->selected_size) 269 i < list->selected_item + list->selected_size)
270 { 270 {
@@ -274,14 +274,12 @@ void list_draw(struct screen *display, struct viewport *parent,
274 else if (show_cursor && i >= list->selected_item && 274 else if (show_cursor && i >= list->selected_item &&
275 i < list->selected_item + list->selected_size) 275 i < list->selected_item + list->selected_size)
276 { 276 {
277 display->set_viewport(&list_icons[display->screen_type]); 277 display->set_viewport(&list_icons);
278 screen_put_icon(display, 0, (i-start), Icon_Cursor); 278 screen_put_icon(display, 0, (i-start), Icon_Cursor);
279 } 279 }
280 } 280 }
281
282 display->set_viewport(parent); 281 display->set_viewport(parent);
283 display->update_viewport(); 282 display->update_viewport();
284 display->set_viewport(NULL);
285} 283}
286 284
287 285
@@ -292,10 +290,10 @@ void list_draw(struct screen *display, struct viewport *parent,
292 */ 290 */
293static bool scrolling=false; 291static bool scrolling=false;
294 292
295unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct viewport *parent) 293unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list)
296{ 294{
297 short x, y; 295 short x, y;
298 unsigned button = action_get_touchscreen_press(&x, &y); 296 int button = action_get_touchscreen_press(&x, &y);
299 int line; 297 int line;
300 struct screen *display = &screens[SCREEN_MAIN]; 298 struct screen *display = &screens[SCREEN_MAIN];
301 if (button == BUTTON_NONE) 299 if (button == BUTTON_NONE)
@@ -315,13 +313,15 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
315 /* Scroll bar */ 313 /* Scroll bar */
316 else 314 else
317 { 315 {
318 int nb_lines = viewport_get_nb_lines(&list_text[SCREEN_MAIN]); 316 int nb_lines = viewport_get_nb_lines(&list_text[screen]);
319 if (nb_lines < gui_list->nb_items) 317 if (nb_lines < gui_list->nb_items)
320 { 318 {
321 int scrollbar_size = nb_lines * font_get(parent->font)->height; 319 int scrollbar_size = nb_lines*
322 int actual_y = y - list_text[SCREEN_MAIN].y; 320 font_get(gui_list->parent[screen]->font)->height;
321 int actual_y = y - list_text[screen].y;
323 322
324 int new_selection = (actual_y * gui_list->nb_items) / scrollbar_size; 323 int new_selection = (actual_y * gui_list->nb_items)
324 / scrollbar_size;
325 325
326 int start_item = new_selection - nb_lines/2; 326 int start_item = new_selection - nb_lines/2;
327 if(start_item < 0) 327 if(start_item < 0)
@@ -329,7 +329,7 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
329 else if(start_item > gui_list->nb_items - nb_lines) 329 else if(start_item > gui_list->nb_items - nb_lines)
330 start_item = gui_list->nb_items - nb_lines; 330 start_item = gui_list->nb_items - nb_lines;
331 331
332 gui_list->start_item[SCREEN_MAIN] = start_item; 332 gui_list->start_item[screen] = start_item;
333 gui_synclist_select_item(gui_list, new_selection); 333 gui_synclist_select_item(gui_list, new_selection);
334 334
335 return ACTION_REDRAW; 335 return ACTION_REDRAW;
@@ -350,27 +350,31 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
350 * | will bring up the context menu of it. | 350 * | will bring up the context menu of it. |
351 * |--------------------------------------------------------| 351 * |--------------------------------------------------------|
352 */ 352 */
353 if (y > list_text[SCREEN_MAIN].y) 353 if (y > list_text[screen].y)
354 { 354 {
355 int line_height, actual_y; 355 int line_height, actual_y;
356 static int last_y = 0; 356 static int last_y = 0;
357 357
358 actual_y = y - list_text[SCREEN_MAIN].y; 358 actual_y = y - list_text[screen].y;
359 line_height = font_get(parent->font)->height; 359 line_height = font_get(gui_list->parent[screen]->font)->height;
360 line = actual_y / line_height; 360 line = actual_y / line_height;
361 361
362 if(actual_y%line_height == 0) /* Pressed a border */ 362 if(actual_y%line_height == 0) /* Pressed a border */
363 return ACTION_NONE; 363 return ACTION_NONE;
364 364
365 if (gui_list->start_item[SCREEN_MAIN]+line > gui_list->nb_items) /* Pressed below the list*/ 365 if (gui_list->start_item[screen]+line > gui_list->nb_items)
366 {
367 /* Pressed below the list*/
366 return ACTION_NONE; 368 return ACTION_NONE;
367 369 }
368 last_y = actual_y; 370 last_y = actual_y;
369 if (line != gui_list->selected_item - gui_list->start_item[SCREEN_MAIN] && button ^ BUTTON_REL) 371 if (line != gui_list->selected_item
372 - gui_list->start_item[screen] && button ^ BUTTON_REL)
370 { 373 {
371 if(button & BUTTON_REPEAT) 374 if(button & BUTTON_REPEAT)
372 scrolling = true; 375 scrolling = true;
373 gui_synclist_select_item(gui_list, gui_list->start_item[SCREEN_MAIN]+line); 376 gui_synclist_select_item(gui_list, gui_list->start_item[screen]
377 + line);
374 return ACTION_REDRAW; 378 return ACTION_REDRAW;
375 } 379 }
376 380
@@ -378,15 +382,17 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
378 { 382 {
379 if(!scrolling) 383 if(!scrolling)
380 { 384 {
381 /* Pen was hold on the same line as the previously selected one 385 /* Pen was hold on the same line as the
382 * => simulate long button press 386 * previously selected one
387 * => simulate long button press
383 */ 388 */
384 return ACTION_STD_CONTEXT; 389 return ACTION_STD_CONTEXT;
385 } 390 }
386 else 391 else
387 { 392 {
388 /* Pen was moved across several lines and then released on this one 393 /* Pen was moved across several lines and then released on
389 * => do nothing 394 * this one
395 * => do nothing
390 */ 396 */
391 scrolling = false; 397 scrolling = false;
392 return ACTION_NONE; 398 return ACTION_NONE;
@@ -394,8 +400,8 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
394 } 400 }
395 else if(button == BUTTON_REL) 401 else if(button == BUTTON_REL)
396 { 402 {
397 /* Pen was released on either the same line as the previously selected one 403 /* Pen was released on either the same line as the previously
398 * or an other one 404 * selected one or an other one
399 * => simulate short press 405 * => simulate short press
400 */ 406 */
401 return ACTION_STD_OK; 407 return ACTION_STD_OK;
@@ -404,11 +410,16 @@ unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct view
404 return ACTION_NONE; 410 return ACTION_NONE;
405 } 411 }
406 /* Title goes up one level (only on BUTTON_REL&~BUTTON_REPEAT) */ 412 /* Title goes up one level (only on BUTTON_REL&~BUTTON_REPEAT) */
407 else if (y > title_text[SCREEN_MAIN].y && draw_title(display, parent, gui_list) && button == BUTTON_REL) 413 else if (y > title_text[screen].y && draw_title(display, gui_list)
414 && button == BUTTON_REL)
415 {
408 return ACTION_STD_CANCEL; 416 return ACTION_STD_CANCEL;
417 }
409 /* Title or statusbar is cancel (only on BUTTON_REL&~BUTTON_REPEAT) */ 418 /* Title or statusbar is cancel (only on BUTTON_REL&~BUTTON_REPEAT) */
410 else if (global_settings.statusbar && button == BUTTON_REL) 419 else if (global_settings.statusbar && button == BUTTON_REL)
420 {
411 return ACTION_STD_CANCEL; 421 return ACTION_STD_CANCEL;
422 }
412 } 423 }
413 return ACTION_NONE; 424 return ACTION_NONE;
414} 425}
diff --git a/apps/gui/charcell/list.c b/apps/gui/charcell/list.c
index b1d0adcdd6..198026e44c 100644
--- a/apps/gui/charcell/list.c
+++ b/apps/gui/charcell/list.c
@@ -40,10 +40,8 @@
40#include "misc.h" 40#include "misc.h"
41#include "talk.h" 41#include "talk.h"
42 42
43void list_draw(struct screen *display, struct viewport *parent, 43void list_draw(struct screen *display, struct gui_synclist *gui_list)
44 struct gui_synclist *gui_list)
45{ 44{
46 (void)parent;
47 int text_pos; 45 int text_pos;
48 bool draw_icons = (gui_list->callback_get_item_icon != NULL && 46 bool draw_icons = (gui_list->callback_get_item_icon != NULL &&
49 global_settings.show_icons); 47 global_settings.show_icons);
diff --git a/apps/gui/gwps-common.c b/apps/gui/gwps-common.c
index 46453dc4c9..5e134b5fa3 100644
--- a/apps/gui/gwps-common.c
+++ b/apps/gui/gwps-common.c
@@ -61,6 +61,7 @@
61#include "playback.h" 61#include "playback.h"
62#endif 62#endif
63#include "backdrop.h" 63#include "backdrop.h"
64#include "viewport.h"
64 65
65#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */ 66#define FF_REWIND_MAX_PERCENT 3 /* cap ff/rewind step size at max % of file */
66 /* 3% of 30min file == 54s step size */ 67 /* 3% of 30min file == 54s step size */
@@ -78,17 +79,17 @@
78#ifdef HAVE_LCD_BITMAP 79#ifdef HAVE_LCD_BITMAP
79static void gui_wps_statusbar_draw(struct gui_wps *wps, bool force) 80static void gui_wps_statusbar_draw(struct gui_wps *wps, bool force)
80{ 81{
82 (void)force;
81 bool draw = global_settings.statusbar; 83 bool draw = global_settings.statusbar;
82 84
83 if (wps->data->wps_sb_tag) 85 if (wps->data->wps_sb_tag)
84 draw = wps->data->show_sb_on_wps; 86 draw = wps->data->show_sb_on_wps;
85 87
86 if (draw) 88 if (!draw)
87 gui_statusbar_draw(wps->statusbar, force); 89 viewportmanager_set_statusbar(false);
88} 90}
89#else 91#else
90#define gui_wps_statusbar_draw(wps, force) \ 92#define gui_wps_statusbar_draw(wps, force)
91 gui_statusbar_draw((wps)->statusbar, (force))
92#endif 93#endif
93#include "pcmbuf.h" 94#include "pcmbuf.h"
94 95
@@ -335,9 +336,6 @@ bool gui_wps_display(void)
335 if (!wps_state.id3 && !(audio_status() & AUDIO_STATUS_PLAY)) 336 if (!wps_state.id3 && !(audio_status() & AUDIO_STATUS_PLAY))
336 { 337 {
337 global_status.resume_index = -1; 338 global_status.resume_index = -1;
338#ifdef HAVE_LCD_BITMAP
339 gui_syncstatusbar_draw(&statusbars, true);
340#endif
341 splash(HZ, ID2P(LANG_END_PLAYLIST)); 339 splash(HZ, ID2P(LANG_END_PLAYLIST));
342 return true; 340 return true;
343 } 341 }
diff --git a/apps/gui/list.c b/apps/gui/list.c
index 00d84cb446..b70cf424ee 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -61,7 +61,7 @@ static int force_list_reinit = false;
61 61
62static void gui_list_select_at_offset(struct gui_synclist * gui_list, 62static void gui_list_select_at_offset(struct gui_synclist * gui_list,
63 int offset); 63 int offset);
64void list_draw(struct screen *display, struct viewport *parent, struct gui_synclist *list); 64void list_draw(struct screen *display, struct gui_synclist *list);
65 65
66#ifdef HAVE_LCD_BITMAP 66#ifdef HAVE_LCD_BITMAP
67static struct viewport parent[NB_SCREENS]; 67static struct viewport parent[NB_SCREENS];
@@ -106,12 +106,13 @@ void list_init_viewports(struct gui_synclist *list)
106#endif 106#endif
107 107
108#ifdef HAVE_LCD_BITMAP 108#ifdef HAVE_LCD_BITMAP
109bool list_display_title(struct gui_synclist *list, struct viewport *vp) 109bool list_display_title(struct gui_synclist *list, enum screen_type screen)
110{ 110{
111 return list->title != NULL && viewport_get_nb_lines(vp)>2; 111 return list->title != NULL &&
112 viewport_get_nb_lines(list->parent[screen])>2;
112} 113}
113#else 114#else
114#define list_display_title(l,v) false 115#define list_display_title(l, i) false
115#endif 116#endif
116 117
117/* 118/*
@@ -180,10 +181,11 @@ void gui_synclist_hide_selection_marker(struct gui_synclist * lists, bool hide)
180 181
181 182
182#ifdef HAVE_LCD_BITMAP 183#ifdef HAVE_LCD_BITMAP
183int list_title_height(struct gui_synclist *list, struct viewport *vp); 184int gui_list_get_item_offset(struct gui_synclist * gui_list,
184 185 int item_width,
185int gui_list_get_item_offset(struct gui_synclist * gui_list, int item_width, 186 int text_pos,
186 int text_pos, struct screen * display, struct viewport *vp) 187 struct screen * display,
188 struct viewport *vp)
187{ 189{
188 int item_offset; 190 int item_offset;
189 191
@@ -241,7 +243,7 @@ void gui_synclist_draw(struct gui_synclist *gui_list)
241 last_list = gui_list; 243 last_list = gui_list;
242 FOR_NB_SCREENS(i) 244 FOR_NB_SCREENS(i)
243 { 245 {
244 list_draw(&screens[i], gui_list->parent[i], gui_list); 246 list_draw(&screens[i], gui_list);
245 } 247 }
246} 248}
247 249
@@ -253,8 +255,8 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list,
253 int difference = gui_list->selected_item - gui_list->start_item[screen]; 255 int difference = gui_list->selected_item - gui_list->start_item[screen];
254 struct viewport vp = *gui_list->parent[screen]; 256 struct viewport vp = *gui_list->parent[screen];
255#ifdef HAVE_LCD_BITMAP 257#ifdef HAVE_LCD_BITMAP
256 if (list_display_title(gui_list, gui_list->parent[screen])) 258 if (list_display_title(gui_list, screen))
257 vp.height -= list_title_height(gui_list,gui_list->parent[screen]); 259 vp.height -= font_get(gui_list->parent[screen]->font)->height;
258#endif 260#endif
259 nb_lines = viewport_get_nb_lines(&vp); 261 nb_lines = viewport_get_nb_lines(&vp);
260 262
@@ -273,7 +275,10 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list,
273 if (global_settings.scroll_paginated) 275 if (global_settings.scroll_paginated)
274 { 276 {
275 if (gui_list->start_item[screen] > gui_list->selected_item) 277 if (gui_list->start_item[screen] > gui_list->selected_item)
276 gui_list->start_item[screen] = (gui_list->selected_item/nb_lines)*nb_lines; 278 {
279 gui_list->start_item[screen] = (gui_list->selected_item/nb_lines)
280 *nb_lines;
281 }
277 if (gui_list->nb_items <= nb_lines) 282 if (gui_list->nb_items <= nb_lines)
278 gui_list->start_item[screen] = 0; 283 gui_list->start_item[screen] = 0;
279 } 284 }
@@ -293,7 +298,7 @@ static void gui_list_put_selection_on_screen(struct gui_synclist * gui_list,
293 if (bottom < 0) 298 if (bottom < 0)
294 bottom = 0; 299 bottom = 0;
295 gui_list->start_item[screen] = MIN(bottom, gui_list->start_item[screen] + 300 gui_list->start_item[screen] = MIN(bottom, gui_list->start_item[screen] +
296 2*gui_list->selected_size); 301 2*gui_list->selected_size);
297 } 302 }
298 else if (global_settings.scroll_paginated) 303 else if (global_settings.scroll_paginated)
299 { 304 {
@@ -351,8 +356,8 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list,
351 { 356 {
352 struct viewport vp = *gui_list->parent[i]; 357 struct viewport vp = *gui_list->parent[i];
353#ifdef HAVE_LCD_BITMAP 358#ifdef HAVE_LCD_BITMAP
354 if (list_display_title(gui_list, gui_list->parent[i])) 359 if (list_display_title(gui_list, i))
355 vp.height -= list_title_height(gui_list,gui_list->parent[i]); 360 vp.height -= font_get(gui_list->parent[i]->font)->height;
356#endif 361#endif
357 nb_lines = viewport_get_nb_lines(&vp); 362 nb_lines = viewport_get_nb_lines(&vp);
358 if (offset > 0) 363 if (offset > 0)
@@ -578,11 +583,11 @@ void gui_synclist_speak_item(struct gui_synclist * lists)
578extern intptr_t get_action_data(void); 583extern intptr_t get_action_data(void);
579#if defined(HAVE_TOUCHSCREEN) 584#if defined(HAVE_TOUCHSCREEN)
580/* this needs to be fixed if we ever get more than 1 touchscreen on a target */ 585/* this needs to be fixed if we ever get more than 1 touchscreen on a target */
581unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list, struct viewport *parent); 586unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list);
582#endif 587#endif
583 588
584bool gui_synclist_do_button(struct gui_synclist * lists, 589bool gui_synclist_do_button(struct gui_synclist * lists,
585 unsigned *actionptr, enum list_wrap wrap) 590 int *actionptr, enum list_wrap wrap)
586{ 591{
587 int action = *actionptr; 592 int action = *actionptr;
588#ifdef HAVE_LCD_BITMAP 593#ifdef HAVE_LCD_BITMAP
@@ -621,7 +626,7 @@ bool gui_synclist_do_button(struct gui_synclist * lists,
621 626
622#if defined(HAVE_TOUCHSCREEN) 627#if defined(HAVE_TOUCHSCREEN)
623 if (action == ACTION_TOUCHSCREEN) 628 if (action == ACTION_TOUCHSCREEN)
624 action = *actionptr = gui_synclist_do_touchscreen(lists, &parent[SCREEN_MAIN]); 629 action = *actionptr = gui_synclist_do_touchscreen(lists);
625#endif 630#endif
626 631
627 switch (wrap) 632 switch (wrap)
@@ -791,8 +796,8 @@ bool gui_synclist_item_is_onscreen(struct gui_synclist *lists,
791{ 796{
792 struct viewport vp = *lists->parent[screen]; 797 struct viewport vp = *lists->parent[screen];
793#ifdef HAVE_LCD_BITMAP 798#ifdef HAVE_LCD_BITMAP
794 if (list_display_title(lists, lists->parent[screen])) 799 if (list_display_title(lists, screen))
795 vp.height -= list_title_height(lists, lists->parent[screen]); 800 vp.height -= font_get(lists->parent[screen]->font)->height;
796#endif 801#endif
797 return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp)); 802 return item <= (lists->start_item[screen] + viewport_get_nb_lines(&vp));
798} 803}
@@ -888,7 +893,6 @@ bool simplelist_show_list(struct simplelist_info *info)
888 893
889 while(1) 894 while(1)
890 { 895 {
891 gui_syncstatusbar_draw(&statusbars, true);
892 list_do_action(CONTEXT_STD, info->timeout, 896 list_do_action(CONTEXT_STD, info->timeout,
893 &lists, &action, wrap); 897 &lists, &action, wrap);
894 898
@@ -900,14 +904,16 @@ bool simplelist_show_list(struct simplelist_info *info)
900 { 904 {
901 bool stdok = action==ACTION_STD_OK; 905 bool stdok = action==ACTION_STD_OK;
902 action = info->action_callback(action, &lists); 906 action = info->action_callback(action, &lists);
903 if (stdok && action == ACTION_STD_CANCEL) /* callback asked us to exit */ 907 if (stdok && action == ACTION_STD_CANCEL)
904 { 908 {
909 /* callback asked us to exit */
905 info->selection = gui_synclist_get_sel_pos(&lists); 910 info->selection = gui_synclist_get_sel_pos(&lists);
906 break; 911 break;
907 } 912 }
908 913
909 if (info->get_name == NULL) 914 if (info->get_name == NULL)
910 gui_synclist_set_nb_items(&lists, simplelist_line_count*info->selection_size); 915 gui_synclist_set_nb_items(&lists,
916 simplelist_line_count*info->selection_size);
911 } 917 }
912 if (action == ACTION_STD_CANCEL) 918 if (action == ACTION_STD_CANCEL)
913 { 919 {
@@ -918,7 +924,10 @@ bool simplelist_show_list(struct simplelist_info *info)
918 (old_line_count != simplelist_line_count)) 924 (old_line_count != simplelist_line_count))
919 { 925 {
920 if (info->get_name == NULL) 926 if (info->get_name == NULL)
921 gui_synclist_set_nb_items(&lists, simplelist_line_count*info->selection_size); 927 {
928 gui_synclist_set_nb_items(&lists,
929 simplelist_line_count*info->selection_size);
930 }
922 gui_synclist_draw(&lists); 931 gui_synclist_draw(&lists);
923 old_line_count = simplelist_line_count; 932 old_line_count = simplelist_line_count;
924 } 933 }
diff --git a/apps/gui/list.h b/apps/gui/list.h
index 643f662f63..c1126f257f 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -179,7 +179,7 @@ extern bool gui_synclist_item_is_onscreen(struct gui_synclist *lists,
179 * NOTE: *action may be changed regardless of return value 179 * NOTE: *action may be changed regardless of return value
180 */ 180 */
181extern bool gui_synclist_do_button(struct gui_synclist * lists, 181extern bool gui_synclist_do_button(struct gui_synclist * lists,
182 unsigned *action, 182 int *action,
183 enum list_wrap); 183 enum list_wrap);
184 184
185/* If the list has a pending postponed scheduled announcement, that 185/* If the list has a pending postponed scheduled announcement, that
diff --git a/apps/gui/option_select.c b/apps/gui/option_select.c
index 570a41a78d..30df8ea6ec 100644
--- a/apps/gui/option_select.c
+++ b/apps/gui/option_select.c
@@ -508,7 +508,6 @@ bool option_screen(const struct settings_list *setting,
508 gui_synclist_draw(&lists); 508 gui_synclist_draw(&lists);
509 /* talk the item */ 509 /* talk the item */
510 gui_synclist_speak_item(&lists); 510 gui_synclist_speak_item(&lists);
511 gui_syncstatusbar_draw(&statusbars, false);
512 while (!done) 511 while (!done)
513 { 512 {
514 if (list_do_action(CONTEXT_LIST, TIMEOUT_BLOCK, 513 if (list_do_action(CONTEXT_LIST, TIMEOUT_BLOCK,
@@ -562,7 +561,6 @@ bool option_screen(const struct settings_list *setting,
562 } 561 }
563 else if(default_event_handler(action) == SYS_USB_CONNECTED) 562 else if(default_event_handler(action) == SYS_USB_CONNECTED)
564 return true; 563 return true;
565 gui_syncstatusbar_draw(&statusbars, false);
566 /* callback */ 564 /* callback */
567 if ( function ) 565 if ( function )
568 function(*variable); 566 function(*variable);
diff --git a/apps/gui/pitchscreen.c b/apps/gui/pitchscreen.c
index 7a05a57743..568bbf4aee 100644
--- a/apps/gui/pitchscreen.c
+++ b/apps/gui/pitchscreen.c
@@ -286,7 +286,6 @@ int gui_syncpitchscreen_run(void)
286 FOR_NB_SCREENS(i) 286 FOR_NB_SCREENS(i)
287 pitchscreen_draw(&screens[i], max_lines[i], 287 pitchscreen_draw(&screens[i], max_lines[i],
288 pitch_viewports[i], pitch); 288 pitch_viewports[i], pitch);
289 gui_syncstatusbar_draw(&statusbars, true);
290 button = get_action(CONTEXT_PITCHSCREEN,HZ); 289 button = get_action(CONTEXT_PITCHSCREEN,HZ);
291 switch (button) { 290 switch (button) {
292 case ACTION_PS_INC_SMALL: 291 case ACTION_PS_INC_SMALL:
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index 3880940ae3..a77453cf66 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -278,7 +278,6 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
278 * - an action taken while pressing the enter button, 278 * - an action taken while pressing the enter button,
279 * then release the enter button*/ 279 * then release the enter button*/
280 bool can_quit = false; 280 bool can_quit = false;
281 gui_syncstatusbar_draw(&statusbars, true);
282 FOR_NB_SCREENS(i) 281 FOR_NB_SCREENS(i)
283 { 282 {
284 screens[i].set_viewport(NULL); 283 screens[i].set_viewport(NULL);
@@ -315,8 +314,6 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
315 314
316 if(button==ACTION_STD_CANCEL) 315 if(button==ACTION_STD_CANCEL)
317 break; 316 break;
318
319 gui_syncstatusbar_draw(&statusbars, false);
320 } 317 }
321 /* Notify that we're exiting this screen */ 318 /* Notify that we're exiting this screen */
322 cond_talk_ids_fq(VOICE_OK); 319 cond_talk_ids_fq(VOICE_OK);
diff --git a/apps/gui/statusbar.c b/apps/gui/statusbar.c
index fc0b9637cf..29b80112f7 100644
--- a/apps/gui/statusbar.c
+++ b/apps/gui/statusbar.c
@@ -43,6 +43,7 @@
43#include "recording.h" 43#include "recording.h"
44#include "pcm_record.h" 44#include "pcm_record.h"
45#endif 45#endif
46#include "appevents.h"
46 47
47/* FIXME: should be removed from icon.h to avoid redefinition, 48/* FIXME: should be removed from icon.h to avoid redefinition,
48 but still needed for compatibility with old system */ 49 but still needed for compatibility with old system */
@@ -817,3 +818,8 @@ int gui_statusbar_height(void)
817 return global_settings.statusbar ? STATUSBAR_HEIGHT : 0; 818 return global_settings.statusbar ? STATUSBAR_HEIGHT : 0;
818} 819}
819 820
821void gui_statusbar_changed(bool enabled)
822{
823 (void)enabled;
824 send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
825}
diff --git a/apps/gui/statusbar.h b/apps/gui/statusbar.h
index f36d609bad..99acf9d006 100644
--- a/apps/gui/statusbar.h
+++ b/apps/gui/statusbar.h
@@ -99,4 +99,6 @@ struct gui_syncstatusbar
99extern void gui_syncstatusbar_init(struct gui_syncstatusbar * bars); 99extern void gui_syncstatusbar_init(struct gui_syncstatusbar * bars);
100extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars, bool force_redraw); 100extern void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars, bool force_redraw);
101extern int gui_statusbar_height(void); 101extern int gui_statusbar_height(void);
102void gui_statusbar_changed(bool enabled);
103
102#endif /*_GUI_STATUSBAR_H_*/ 104#endif /*_GUI_STATUSBAR_H_*/
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index ef61494b71..9cd905fa14 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -33,6 +33,9 @@
33#include "viewport.h" 33#include "viewport.h"
34#include "statusbar.h" 34#include "statusbar.h"
35#include "screen_access.h" 35#include "screen_access.h"
36#include "appevents.h"
37
38static bool statusbar_enabled = true;
36 39
37int viewport_get_nb_lines(struct viewport *vp) 40int viewport_get_nb_lines(struct viewport *vp)
38{ 41{
@@ -50,7 +53,7 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
50 vp->x = 0; 53 vp->x = 0;
51 vp->width = screens[screen].lcdwidth; 54 vp->width = screens[screen].lcdwidth;
52 55
53 vp->y = gui_statusbar_height(); 56 vp->y = statusbar_enabled?gui_statusbar_height():0;
54 vp->height = screens[screen].lcdheight - vp->y; 57 vp->height = screens[screen].lcdheight - vp->y;
55#ifdef HAVE_LCD_BITMAP 58#ifdef HAVE_LCD_BITMAP
56 vp->drawmode = DRMODE_SOLID; 59 vp->drawmode = DRMODE_SOLID;
@@ -82,3 +85,31 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
82 } 85 }
83#endif 86#endif
84} 87}
88
89
90void viewportmanager_set_statusbar(bool enabled)
91{
92 if (enabled && global_settings.statusbar)
93 {
94 add_event(GUI_EVENT_FOURHERTZ, false, viewportmanager_draw_statusbars);
95 gui_syncstatusbar_draw(&statusbars, true);
96 }
97 else
98 {
99 remove_event(GUI_EVENT_FOURHERTZ, viewportmanager_draw_statusbars);
100 }
101 statusbar_enabled = enabled;
102}
103
104void viewportmanager_draw_statusbars(void* data)
105{
106 (void)data;
107 if (statusbar_enabled)
108 gui_syncstatusbar_draw(&statusbars, false);
109}
110
111void viewportmanager_statusbar_changed(void* data)
112{
113 (void)data;
114 viewportmanager_set_statusbar(statusbar_enabled);
115}
diff --git a/apps/gui/viewport.h b/apps/gui/viewport.h
index 3605dbe711..cdb481017a 100644
--- a/apps/gui/viewport.h
+++ b/apps/gui/viewport.h
@@ -40,3 +40,9 @@ int viewport_get_nb_lines(struct viewport *vp);
40int viewport_load_config(const char *config, struct viewport *vp); 40int viewport_load_config(const char *config, struct viewport *vp);
41 41
42void viewport_set_defaults(struct viewport *vp, enum screen_type screen); 42void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
43
44void viewportmanager_set_statusbar(bool enabled);
45/* callbacks for GUI_EVENT_* events */
46void viewportmanager_draw_statusbars(void*data);
47void viewportmanager_statusbar_changed(void* data);
48
diff --git a/apps/gui/yesno.c b/apps/gui/yesno.c
index 297f7f8987..756d267c63 100644
--- a/apps/gui/yesno.c
+++ b/apps/gui/yesno.c
@@ -131,7 +131,7 @@ enum yesno_res gui_syncyesno_run(const struct text_message * main_message,
131 const struct text_message * no_message) 131 const struct text_message * no_message)
132{ 132{
133 int i; 133 int i;
134 unsigned button; 134 int button;
135 int result=-1; 135 int result=-1;
136 bool result_displayed; 136 bool result_displayed;
137 struct gui_yesno yn[NB_SCREENS]; 137 struct gui_yesno yn[NB_SCREENS];
diff --git a/apps/main.c b/apps/main.c
index 45e6c77801..c62ee080b3 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -121,6 +121,16 @@ const char appsversion[]=APPSVERSION;
121 121
122static void init(void); 122static void init(void);
123 123
124void fourhertz_tick_task(void)
125{
126 static long last_fire = 0;
127 if (TIME_AFTER(current_tick, last_fire+HZ/4))
128 {
129 queue_post(&button_queue, SYS_FOURHERTZ, 0);
130 last_fire = current_tick;
131 }
132}
133
124#ifdef SIMULATOR 134#ifdef SIMULATOR
125void app_main(void) 135void app_main(void)
126#else 136#else
@@ -138,6 +148,10 @@ static void app_main(void)
138#ifdef HAVE_TOUCHSCREEN 148#ifdef HAVE_TOUCHSCREEN
139 touchscreen_set_mode(TOUCHSCREEN_BUTTON); 149 touchscreen_set_mode(TOUCHSCREEN_BUTTON);
140#endif 150#endif
151 tick_add_task(fourhertz_tick_task);
152 viewportmanager_set_statusbar(true);
153 add_event(GUI_EVENT_STATUSBAR_TOGGLE, false,
154 viewportmanager_statusbar_changed);
141 root_menu(); 155 root_menu();
142} 156}
143 157
diff --git a/apps/menu.c b/apps/menu.c
index a0317e4a84..b5309a047e 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -283,29 +283,6 @@ static int talk_menu_item(int selected_item, void *data)
283 } 283 }
284 return 0; 284 return 0;
285} 285}
286/* this is used to reload the default menu viewports when the
287 theme changes. nothing happens if the menu is using a supplied parent vp */
288static void init_default_menu_viewports(struct viewport parent[NB_SCREENS], bool hide_bars)
289{
290 int i;
291 FOR_NB_SCREENS(i)
292 {
293 viewport_set_defaults(&parent[i], i);
294 /* viewport_set_defaults() fixes the vp for the bars, so resize */
295 if (hide_bars)
296 {
297 if (global_settings.statusbar)
298 {
299 parent[i].y -= STATUSBAR_HEIGHT;
300 parent[i].height += STATUSBAR_HEIGHT;
301 }
302 }
303 }
304#ifdef HAVE_BUTTONBAR
305 if (!hide_bars && global_settings.buttonbar)
306 parent[0].height -= BUTTONBAR_HEIGHT;
307#endif
308}
309 286
310bool do_setting_from_menu(const struct menu_item_ex *temp, 287bool do_setting_from_menu(const struct menu_item_ex *temp,
311 struct viewport parent[NB_SCREENS]) 288 struct viewport parent[NB_SCREENS])
@@ -383,8 +360,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
383 int menu_stack_selected_item[MAX_MENUS]; 360 int menu_stack_selected_item[MAX_MENUS];
384 int stack_top = 0; 361 int stack_top = 0;
385 bool in_stringlist, done = false; 362 bool in_stringlist, done = false;
386 363 struct viewport *vps = NULL;
387 struct viewport *vps, menu_vp[NB_SCREENS]; /* menu_vp will hopefully be phased out */
388#ifdef HAVE_BUTTONBAR 364#ifdef HAVE_BUTTONBAR
389 struct gui_buttonbar buttonbar; 365 struct gui_buttonbar buttonbar;
390 gui_buttonbar_init(&buttonbar); 366 gui_buttonbar_init(&buttonbar);
@@ -396,27 +372,12 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
396 if (start_menu == NULL) 372 if (start_menu == NULL)
397 menu = &main_menu_; 373 menu = &main_menu_;
398 else menu = start_menu; 374 else menu = start_menu;
399 375
400 init_default_menu_viewports(menu_vp, hide_bars); 376 /* if hide_bars is true, assume parent has been fixed before passed into
401 377 * this function, e.g. with viewport_set_defaults(parent, screen, true) */
402 if (parent) 378 init_menu_lists(menu, &lists, selected, true, parent);
403 { 379 vps = *(lists.parent);
404 vps = parent;
405 /* if hide_bars == true we assume the viewport is correctly sized */
406 }
407 else
408 {
409 vps = menu_vp;
410 }
411 FOR_NB_SCREENS(i)
412 {
413 screens[i].set_viewport(&vps[i]);
414 screens[i].clear_viewport();
415 screens[i].set_viewport(NULL);
416 }
417 init_menu_lists(menu, &lists, selected, true, vps);
418 in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); 380 in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID);
419
420 /* load the callback, and only reload it if menu changes */ 381 /* load the callback, and only reload it if menu changes */
421 get_menu_callback(menu, &menu_callback); 382 get_menu_callback(menu, &menu_callback);
422 383
@@ -436,7 +397,6 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
436#ifdef HAVE_BUTTONBAR 397#ifdef HAVE_BUTTONBAR
437 gui_buttonbar_draw(&buttonbar); 398 gui_buttonbar_draw(&buttonbar);
438#endif 399#endif
439 gui_syncstatusbar_draw(&statusbars, true);
440 } 400 }
441 action = get_action(CONTEXT_MAINMENU, 401 action = get_action(CONTEXT_MAINMENU,
442 list_do_action_timeout(&lists, HZ)); 402 list_do_action_timeout(&lists, HZ));
@@ -496,7 +456,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
496 else if (!in_stringlist) 456 else if (!in_stringlist)
497 { 457 {
498 int type; 458 int type;
499 selected = get_menu_selection(gui_synclist_get_sel_pos(&lists), menu); 459 selected = get_menu_selection(gui_synclist_get_sel_pos(&lists),menu);
500 temp = menu->submenus[selected]; 460 temp = menu->submenus[selected];
501 type = (temp->flags&MENU_TYPE_MASK); 461 type = (temp->flags&MENU_TYPE_MASK);
502 if ((type == MT_SETTING_W_TEXT || type == MT_SETTING)) 462 if ((type == MT_SETTING_W_TEXT || type == MT_SETTING))
@@ -640,9 +600,9 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
640 temp->function->param); 600 temp->function->param);
641 else 601 else
642 return_value = temp->function->function(); 602 return_value = temp->function->function();
643 if (!(menu->flags&MENU_EXITAFTERTHISMENU) || (temp->flags&MENU_EXITAFTERTHISMENU)) 603 if (!(menu->flags&MENU_EXITAFTERTHISMENU) ||
604 (temp->flags&MENU_EXITAFTERTHISMENU))
644 { 605 {
645 init_default_menu_viewports(menu_vp, hide_bars);
646 init_menu_lists(menu, &lists, selected, true, vps); 606 init_menu_lists(menu, &lists, selected, true, vps);
647 } 607 }
648 if (temp->flags&MENU_FUNC_CHECK_RETVAL) 608 if (temp->flags&MENU_FUNC_CHECK_RETVAL)
@@ -658,9 +618,8 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
658 case MT_SETTING: 618 case MT_SETTING:
659 case MT_SETTING_W_TEXT: 619 case MT_SETTING_W_TEXT:
660 { 620 {
661 if (do_setting_from_menu(temp, menu_vp)) 621 if (do_setting_from_menu(temp, vps))
662 { 622 {
663 init_default_menu_viewports(menu_vp, hide_bars);
664 init_menu_lists(menu, &lists, selected, true,vps); 623 init_menu_lists(menu, &lists, selected, true,vps);
665 redraw_lists = false; /* above does the redraw */ 624 redraw_lists = false; /* above does the redraw */
666 } 625 }
diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c
index b22824d8bd..8611a66397 100644
--- a/apps/menus/main_menu.c
+++ b/apps/menus/main_menu.c
@@ -117,7 +117,8 @@ static bool show_credits(void)
117 { 117 {
118 /* show the rockbox logo and version untill a button is pressed */ 118 /* show the rockbox logo and version untill a button is pressed */
119 show_logo(); 119 show_logo();
120 get_action(CONTEXT_STD, TIMEOUT_BLOCK); 120 while (IS_SYSEVENT(get_action(CONTEXT_STD, TIMEOUT_BLOCK)))
121 ;
121 } 122 }
122 return false; 123 return false;
123} 124}
diff --git a/apps/menus/recording_menu.c b/apps/menus/recording_menu.c
index 3b5a25ebc0..b9f5f7be78 100644
--- a/apps/menus/recording_menu.c
+++ b/apps/menus/recording_menu.c
@@ -537,7 +537,6 @@ int rectrigger(void)
537 if (changed) 537 if (changed)
538 { 538 {
539 gui_synclist_draw(&lists); 539 gui_synclist_draw(&lists);
540 gui_syncstatusbar_draw(&statusbars, true);
541 peak_meter_trigger(global_settings.rec_trigger_mode!=TRIG_OFF); 540 peak_meter_trigger(global_settings.rec_trigger_mode!=TRIG_OFF);
542 settings_apply_trigger(); 541 settings_apply_trigger();
543 changed = false; 542 changed = false;
diff --git a/apps/menus/time_menu.c b/apps/menus/time_menu.c
index cb1a93c28e..6d5abed622 100644
--- a/apps/menus/time_menu.c
+++ b/apps/menus/time_menu.c
@@ -295,9 +295,7 @@ int time_screen(void* ignored)
295 if (global_settings.buttonbar) 295 if (global_settings.buttonbar)
296 menu[i].height -= BUTTONBAR_HEIGHT; 296 menu[i].height -= BUTTONBAR_HEIGHT;
297#endif 297#endif
298 screens[i].clear_display();
299 draw_timedate(&clock[i], &screens[i]); 298 draw_timedate(&clock[i], &screens[i]);
300 screens[i].update();
301 } 299 }
302 ret = do_menu(&time_menu, NULL, menu, false); 300 ret = do_menu(&time_menu, NULL, menu, false);
303 /* see comments above in the button callback */ 301 /* see comments above in the button callback */
diff --git a/apps/misc.c b/apps/misc.c
index 8b73411549..894b0c2cc4 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -33,6 +33,7 @@
33#endif 33#endif
34#else 34#else
35#include "sprintf.h" 35#include "sprintf.h"
36#include "appevents.h"
36#include "lang.h" 37#include "lang.h"
37#include "string.h" 38#include "string.h"
38#include "dir.h" 39#include "dir.h"
@@ -60,6 +61,7 @@
60#include "sound.h" 61#include "sound.h"
61#include "playlist.h" 62#include "playlist.h"
62#include "yesno.h" 63#include "yesno.h"
64#include "viewport.h"
63 65
64#ifdef IPOD_ACCESSORY_PROTOCOL 66#ifdef IPOD_ACCESSORY_PROTOCOL
65#include "iap.h" 67#include "iap.h"
@@ -904,6 +906,9 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame
904{ 906{
905 switch(event) 907 switch(event)
906 { 908 {
909 case SYS_FOURHERTZ:
910 send_event(GUI_EVENT_FOURHERTZ, NULL);
911 break;
907 case SYS_BATTERY_UPDATE: 912 case SYS_BATTERY_UPDATE:
908 if(global_settings.talk_battery_level) 913 if(global_settings.talk_battery_level)
909 { 914 {
diff --git a/apps/onplay.c b/apps/onplay.c
index 42924a18a0..7c89e6320f 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -212,7 +212,6 @@ static bool add_to_playlist(int position, bool queue)
212 if (global_settings.playlist_shuffle) 212 if (global_settings.playlist_shuffle)
213 playlist_shuffle(current_tick, -1); 213 playlist_shuffle(current_tick, -1);
214 playlist_start(0,0); 214 playlist_start(0,0);
215 gui_syncstatusbar_draw(&statusbars, false);
216 onplay_result = ONPLAY_START_PLAY; 215 onplay_result = ONPLAY_START_PLAY;
217 } 216 }
218 217
diff --git a/apps/playlist_catalog.c b/apps/playlist_catalog.c
index 7daae15552..105c3e0e83 100644
--- a/apps/playlist_catalog.c
+++ b/apps/playlist_catalog.c
@@ -295,10 +295,6 @@ static int display_playlists(char* playlist, bool view)
295 } 295 }
296 break; 296 break;
297 297
298 case ACTION_NONE:
299 gui_syncstatusbar_draw(&statusbars, false);
300 break;
301
302 default: 298 default:
303 if(default_event_handler(button) == SYS_USB_CONNECTED) 299 if(default_event_handler(button) == SYS_USB_CONNECTED)
304 { 300 {
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index 2acc02abe4..30dcfd0a1c 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -746,10 +746,6 @@ bool playlist_viewer_ex(const char* filename)
746 gui_synclist_draw(&playlist_lists); 746 gui_synclist_draw(&playlist_lists);
747 break; 747 break;
748 748
749 case ACTION_NONE:
750 gui_syncstatusbar_draw(&statusbars, false);
751 break;
752
753 default: 749 default:
754 if(default_event_handler(button) == SYS_USB_CONNECTED) 750 if(default_event_handler(button) == SYS_USB_CONNECTED)
755 { 751 {
@@ -834,7 +830,6 @@ bool search_playlist(void)
834 gui_synclist_draw(&playlist_lists); 830 gui_synclist_draw(&playlist_lists);
835 while (!exit) 831 while (!exit)
836 { 832 {
837 gui_syncstatusbar_draw(&statusbars, false);
838 button = get_action(CONTEXT_LIST, HZ/4); 833 button = get_action(CONTEXT_LIST, HZ/4);
839 if (gui_synclist_do_button(&playlist_lists, &button, LIST_WRAP_UNLESS_HELD)) 834 if (gui_synclist_do_button(&playlist_lists, &button, LIST_WRAP_UNLESS_HELD))
840 continue; 835 continue;
diff --git a/apps/plugin.c b/apps/plugin.c
index f78b6bf4e1..5e02d33a95 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -621,6 +621,7 @@ static const struct plugin_api rockbox_api = {
621 appsversion, 621 appsversion,
622 /* new stuff at the end, sort into place next time 622 /* new stuff at the end, sort into place next time
623 the API gets incompatible */ 623 the API gets incompatible */
624 viewportmanager_set_statusbar,
624}; 625};
625 626
626int plugin_load(const char* plugin, const void* parameter) 627int plugin_load(const char* plugin, const void* parameter)
@@ -731,8 +732,11 @@ int plugin_load(const char* plugin, const void* parameter)
731#endif 732#endif
732 733
733 invalidate_icache(); 734 invalidate_icache();
735 viewportmanager_set_statusbar(false);
734 736
735 rc = hdr->entry_point(&rockbox_api, parameter); 737 rc = hdr->entry_point(&rockbox_api, parameter);
738
739 viewportmanager_set_statusbar(true);
736 740
737 button_clear_queue(); 741 button_clear_queue();
738 742
diff --git a/apps/plugin.h b/apps/plugin.h
index 81c069666a..440541d510 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -7,7 +7,7 @@
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 Björn Stenberg 10 * Copyright (C) 2002 Bj�rn Stenberg
11 * 11 *
12 * This program is free software; you can redistribute it and/or 12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License 13 * modify it under the terms of the GNU General Public License
@@ -132,7 +132,7 @@ void* plugin_get_buffer(size_t *buffer_size);
132#define PLUGIN_MAGIC 0x526F634B /* RocK */ 132#define PLUGIN_MAGIC 0x526F634B /* RocK */
133 133
134/* increase this every time the api struct changes */ 134/* increase this every time the api struct changes */
135#define PLUGIN_API_VERSION 131 135#define PLUGIN_API_VERSION 132
136 136
137/* update this to latest version if a change to the api struct breaks 137/* update this to latest version if a change to the api struct breaks
138 backwards compatibility (and please take the opportunity to sort in any 138 backwards compatibility (and please take the opportunity to sort in any
@@ -334,7 +334,7 @@ struct plugin_api {
334 void (*gui_synclist_del_item)(struct gui_synclist * lists); 334 void (*gui_synclist_del_item)(struct gui_synclist * lists);
335 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll); 335 void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll);
336 bool (*gui_synclist_do_button)(struct gui_synclist * lists, 336 bool (*gui_synclist_do_button)(struct gui_synclist * lists,
337 unsigned *action, enum list_wrap wrap); 337 int *action, enum list_wrap wrap);
338 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon); 338 void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon);
339 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message, 339 enum yesno_res (*gui_syncyesno_run)(const struct text_message * main_message,
340 const struct text_message * yes_message, 340 const struct text_message * yes_message,
@@ -785,6 +785,7 @@ struct plugin_api {
785 const char *appsversion; 785 const char *appsversion;
786 /* new stuff at the end, sort into place next time 786 /* new stuff at the end, sort into place next time
787 the API gets incompatible */ 787 the API gets incompatible */
788 void (*viewportmanager_set_statusbar)(bool enabled);
788}; 789};
789 790
790/* plugin header */ 791/* plugin header */
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index 17b98c7f56..55771de919 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -674,7 +674,6 @@ static bool view_events(int selected, struct shown *shown)
674 674
675 while (!exit) 675 while (!exit)
676 { 676 {
677 rb->gui_syncstatusbar_draw(rb->statusbars, true);
678 button = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK); 677 button = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
679 rb->gui_synclist_do_button(&gui_memos,&button,LIST_WRAP_UNLESS_HELD); 678 rb->gui_synclist_do_button(&gui_memos,&button,LIST_WRAP_UNLESS_HELD);
680 679
diff --git a/apps/plugins/chessbox/chessbox_pgn.c b/apps/plugins/chessbox/chessbox_pgn.c
index 1aff214332..8c92573b75 100644
--- a/apps/plugins/chessbox/chessbox_pgn.c
+++ b/apps/plugins/chessbox/chessbox_pgn.c
@@ -640,7 +640,6 @@ struct pgn_game_node* pgn_show_game_list(const struct plugin_api* api,
640 rb->gui_synclist_select_item(&games_list, 0); 640 rb->gui_synclist_select_item(&games_list, 0);
641 641
642 while (true) { 642 while (true) {
643 rb->gui_syncstatusbar_draw(rb->statusbars, true);
644 rb->gui_synclist_draw(&games_list); 643 rb->gui_synclist_draw(&games_list);
645 curr_selection = rb->gui_synclist_get_sel_pos(&games_list); 644 curr_selection = rb->gui_synclist_get_sel_pos(&games_list);
646 button = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK); 645 button = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
diff --git a/apps/plugins/keybox.c b/apps/plugins/keybox.c
index dae413ccbc..6ec86f6950 100644
--- a/apps/plugins/keybox.c
+++ b/apps/plugins/keybox.c
@@ -556,7 +556,6 @@ static int keybox(void)
556 556
557 while (!done) 557 while (!done)
558 { 558 {
559 rb->gui_syncstatusbar_draw(rb->statusbars, true);
560 rb->gui_synclist_draw(&kb_list); 559 rb->gui_synclist_draw(&kb_list);
561 button = rb->get_action(CONTEXT_LIST, TIMEOUT_BLOCK); 560 button = rb->get_action(CONTEXT_LIST, TIMEOUT_BLOCK);
562 if (rb->gui_synclist_do_button(&kb_list, &button, LIST_WRAP_ON)) 561 if (rb->gui_synclist_do_button(&kb_list, &button, LIST_WRAP_ON))
diff --git a/apps/plugins/lib/oldmenuapi.c b/apps/plugins/lib/oldmenuapi.c
index b83f926532..a48a61bca6 100644
--- a/apps/plugins/lib/oldmenuapi.c
+++ b/apps/plugins/lib/oldmenuapi.c
@@ -98,7 +98,6 @@ int menu_show(int m)
98 int key; 98 int key;
99 99
100 rb->gui_synclist_draw(&(menus[m].synclist)); 100 rb->gui_synclist_draw(&(menus[m].synclist));
101 rb->gui_syncstatusbar_draw(rb->statusbars, true);
102 while (!exit) { 101 while (!exit) {
103 key = rb->get_action(CONTEXT_MAINMENU,HZ/2); 102 key = rb->get_action(CONTEXT_MAINMENU,HZ/2);
104 /* 103 /*
@@ -126,7 +125,6 @@ int menu_show(int m)
126 return MENU_ATTACHED_USB; 125 return MENU_ATTACHED_USB;
127 break; 126 break;
128 } 127 }
129 rb->gui_syncstatusbar_draw(rb->statusbars, false);
130 } 128 }
131 return MENU_SELECTED_EXIT; 129 return MENU_SELECTED_EXIT;
132} 130}
@@ -149,7 +147,6 @@ bool menu_run(int m)
149 if (menus[m].items[selected].function && 147 if (menus[m].items[selected].function &&
150 menus[m].items[selected].function()) 148 menus[m].items[selected].function())
151 return true; 149 return true;
152 rb->gui_syncstatusbar_draw(rb->statusbars, true);
153 } 150 }
154 } 151 }
155 } 152 }
diff --git a/apps/plugins/shortcuts/shortcuts_view.c b/apps/plugins/shortcuts/shortcuts_view.c
index 09b25480e8..eb3cb9506c 100644
--- a/apps/plugins/shortcuts/shortcuts_view.c
+++ b/apps/plugins/shortcuts/shortcuts_view.c
@@ -58,8 +58,6 @@ enum sc_list_action_type draw_sc_list(struct gui_synclist gui_sc)
58 rb->gui_synclist_draw(&gui_sc); 58 rb->gui_synclist_draw(&gui_sc);
59 59
60 while (true) { 60 while (true) {
61 /* draw the statusbar, should be done often */
62 rb->gui_syncstatusbar_draw(rb->statusbars, true);
63 /* user input */ 61 /* user input */
64 button = rb->get_action(CONTEXT_LIST, TIMEOUT_BLOCK); 62 button = rb->get_action(CONTEXT_LIST, TIMEOUT_BLOCK);
65 if (rb->gui_synclist_do_button(&gui_sc, &button, 63 if (rb->gui_synclist_do_button(&gui_sc, &button,
diff --git a/apps/plugins/star.c b/apps/plugins/star.c
index f358755e2a..c217fb922f 100644
--- a/apps/plugins/star.c
+++ b/apps/plugins/star.c
@@ -1008,9 +1008,6 @@ static int star_menu(void)
1008 FOR_NB_SCREENS(selection) 1008 FOR_NB_SCREENS(selection)
1009 { 1009 {
1010 rb->viewport_set_defaults(&vp[selection], selection); 1010 rb->viewport_set_defaults(&vp[selection], selection);
1011 /* we are hiding the statusbar so fix the height also */
1012 vp[selection].y = 0;
1013 vp[selection].height = rb->screens[selection]->lcdheight;
1014#if LCD_DEPTH > 1 1011#if LCD_DEPTH > 1
1015 if (rb->screens[selection]->depth > 1) 1012 if (rb->screens[selection]->depth > 1)
1016 { 1013 {
@@ -1112,7 +1109,6 @@ static int star_menu(void)
1112 level--; 1109 level--;
1113 star_run_game(level); 1110 star_run_game(level);
1114 } 1111 }
1115
1116 return PLUGIN_OK; 1112 return PLUGIN_OK;
1117} 1113}
1118 1114
diff --git a/apps/plugins/zxbox/zxbox_keyb.c b/apps/plugins/zxbox/zxbox_keyb.c
index 7ae3862fc2..36f1d519d9 100644
--- a/apps/plugins/zxbox/zxbox_keyb.c
+++ b/apps/plugins/zxbox/zxbox_keyb.c
@@ -443,8 +443,6 @@ int zx_kbd_input(char* text/*, int buflen*/)
443 rb->screens[l]->set_drawmode(DRMODE_SOLID); 443 rb->screens[l]->set_drawmode(DRMODE_SOLID);
444 } 444 }
445 445
446
447/* gui_syncstatusbar_draw(&statusbars, true);*/
448 FOR_NB_SCREENS(l) 446 FOR_NB_SCREENS(l)
449 rb->screens[l]->update(); 447 rb->screens[l]->update();
450 448
@@ -554,10 +552,6 @@ int zx_kbd_input(char* text/*, int buflen*/)
554 } 552 }
555 break; 553 break;
556 554
557 case BUTTON_NONE:
558 /*gui_syncstatusbar_draw(&statusbars, false);*/
559
560 break;
561 555
562 default: 556 default:
563 if(rb->default_event_handler(button) == SYS_USB_CONNECTED) 557 if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c
index f72def6a8a..26413e99da 100644
--- a/apps/recorder/keyboard.c
+++ b/apps/recorder/keyboard.c
@@ -743,7 +743,6 @@ int kbd_input(char* text, int buflen)
743 sc->set_drawmode(DRMODE_SOLID); 743 sc->set_drawmode(DRMODE_SOLID);
744 } 744 }
745 745
746 gui_syncstatusbar_draw(&statusbars, true);
747 FOR_NB_SCREENS(l) 746 FOR_NB_SCREENS(l)
748 screens[l].update(); 747 screens[l].update();
749 748
@@ -1190,7 +1189,6 @@ int kbd_input(char* text, int buflen)
1190#endif /* !defined (KBD_MODES) || defined (KBD_CURSOR_KEYS) */ 1189#endif /* !defined (KBD_MODES) || defined (KBD_CURSOR_KEYS) */
1191 1190
1192 case BUTTON_NONE: 1191 case BUTTON_NONE:
1193 gui_syncstatusbar_draw(&statusbars, false);
1194#ifdef KBD_MORSE_INPUT 1192#ifdef KBD_MORSE_INPUT
1195 if (morse_reading) 1193 if (morse_reading)
1196 { 1194 {
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index a6213abfb1..d01d24ccf2 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -489,7 +489,6 @@ int radio_screen(void)
489 /* always display status bar in radio screen for now */ 489 /* always display status bar in radio screen for now */
490 global_status.statusbar_forced = statusbar?0:1; 490 global_status.statusbar_forced = statusbar?0:1;
491 global_settings.statusbar = true; 491 global_settings.statusbar = true;
492 gui_syncstatusbar_draw(&statusbars,true);
493 FOR_NB_SCREENS(i) 492 FOR_NB_SCREENS(i)
494 { 493 {
495 viewport_set_defaults(&vp[i], i); 494 viewport_set_defaults(&vp[i], i);
@@ -986,8 +985,6 @@ int radio_screen(void)
986 gui_buttonbar_draw(&buttonbar); 985 gui_buttonbar_draw(&buttonbar);
987#endif 986#endif
988 } 987 }
989 /* Only force the redraw if update_screen is true */
990 gui_syncstatusbar_draw(&statusbars,true);
991 } 988 }
992 989
993 update_screen = false; 990 update_screen = false;
@@ -1027,7 +1024,6 @@ int radio_screen(void)
1027 if(audio_status() & AUDIO_STATUS_ERROR) 1024 if(audio_status() & AUDIO_STATUS_ERROR)
1028 { 1025 {
1029 splash(0, str(LANG_DISK_FULL)); 1026 splash(0, str(LANG_DISK_FULL));
1030 gui_syncstatusbar_draw(&statusbars,true);
1031 FOR_NB_SCREENS(i) 1027 FOR_NB_SCREENS(i)
1032 { 1028 {
1033 screens[i].set_viewport(&vp[i]); 1029 screens[i].set_viewport(&vp[i]);
@@ -1397,7 +1393,6 @@ static int handle_radio_presets(void)
1397 while (result == 0) 1393 while (result == 0)
1398 { 1394 {
1399 gui_synclist_draw(&lists); 1395 gui_synclist_draw(&lists);
1400 gui_syncstatusbar_draw(&statusbars, true);
1401 list_do_action(CONTEXT_STD, TIMEOUT_BLOCK, 1396 list_do_action(CONTEXT_STD, TIMEOUT_BLOCK,
1402 &lists, &action, LIST_WRAP_UNLESS_HELD); 1397 &lists, &action, LIST_WRAP_UNLESS_HELD);
1403 switch (action) 1398 switch (action)
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index a8586b9735..bdf30212f7 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -1038,7 +1038,6 @@ bool recording_screen(bool no_source)
1038 bool statusbar = global_settings.statusbar; 1038 bool statusbar = global_settings.statusbar;
1039 global_status.statusbar_forced = statusbar?0:1; 1039 global_status.statusbar_forced = statusbar?0:1;
1040 global_settings.statusbar = true; 1040 global_settings.statusbar = true;
1041 gui_syncstatusbar_draw(&statusbars,true);
1042#endif 1041#endif
1043 1042
1044 static const unsigned char *byte_units[] = { 1043 static const unsigned char *byte_units[] = {
@@ -1102,7 +1101,7 @@ bool recording_screen(bool no_source)
1102 /* top vp, 4 lines, force sys font if total screen < 6 lines 1101 /* top vp, 4 lines, force sys font if total screen < 6 lines
1103 NOTE: one could limit the list to 1 line and get away with 5 lines */ 1102 NOTE: one could limit the list to 1 line and get away with 5 lines */
1104 v = &vp_top[i]; 1103 v = &vp_top[i];
1105 viewport_set_defaults(v, i); /*already takes care of statusbar*/ 1104 viewport_set_defaults(v, i);
1106 if (viewport_get_nb_lines(v) < 4) 1105 if (viewport_get_nb_lines(v) < 4)
1107 { 1106 {
1108 /* compact needs 4 lines total */ 1107 /* compact needs 4 lines total */
@@ -1864,7 +1863,6 @@ bool recording_screen(bool no_source)
1864 /* draw peakmeter again (check if this can be removed) */ 1863 /* draw peakmeter again (check if this can be removed) */
1865 FOR_NB_ACTIVE_SCREENS(i) 1864 FOR_NB_ACTIVE_SCREENS(i)
1866 { 1865 {
1867 screens[i].set_viewport(NULL);
1868 gui_statusbar_draw(&(statusbars.statusbars[i]), true); 1866 gui_statusbar_draw(&(statusbars.statusbars[i]), true);
1869 screens[i].set_viewport(&vp_top[i]); 1867 screens[i].set_viewport(&vp_top[i]);
1870 peak_meter_screen(&screens[i], pm_x[i], pm_y[i], pm_h[i]); 1868 peak_meter_screen(&screens[i], pm_x[i], pm_y[i], pm_h[i]);
@@ -1882,7 +1880,6 @@ bool recording_screen(bool no_source)
1882 if (audio_stat & AUDIO_STATUS_ERROR) 1880 if (audio_stat & AUDIO_STATUS_ERROR)
1883 { 1881 {
1884 splash(0, str(LANG_DISK_FULL)); 1882 splash(0, str(LANG_DISK_FULL));
1885 gui_syncstatusbar_draw(&statusbars, true);
1886 1883
1887 FOR_NB_SCREENS(i) 1884 FOR_NB_SCREENS(i)
1888 screens[i].update(); 1885 screens[i].update();
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 9d4f256370..3b0907f00a 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -46,6 +46,7 @@
46#include "buttonbar.h" 46#include "buttonbar.h"
47#include "action.h" 47#include "action.h"
48#include "yesno.h" 48#include "yesno.h"
49#include "viewport.h"
49 50
50#include "tree.h" 51#include "tree.h"
51#if CONFIG_TUNER 52#if CONFIG_TUNER
@@ -117,7 +118,6 @@ static int browser(void* param)
117 /* Now display progress until it's ready or the user exits */ 118 /* Now display progress until it's ready or the user exits */
118 while(!tagcache_is_usable()) 119 while(!tagcache_is_usable())
119 { 120 {
120 gui_syncstatusbar_draw(&statusbars, false);
121 struct tagcache_stat *stat = tagcache_get_stat(); 121 struct tagcache_stat *stat = tagcache_get_stat();
122 122
123 /* Allow user to exit */ 123 /* Allow user to exit */
@@ -262,6 +262,8 @@ static int wpsscrn(void* param)
262#if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 262#if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
263 show_remote_main_backdrop(); 263 show_remote_main_backdrop();
264#endif 264#endif
265 /* always re-enable the statusbar after the WPS */
266 viewportmanager_set_statusbar(true);
265 return ret_val; 267 return ret_val;
266} 268}
267#if CONFIG_TUNER 269#if CONFIG_TUNER
diff --git a/apps/screens.c b/apps/screens.c
index 230e9ae53c..8a787a5ca1 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -138,7 +138,6 @@ void usb_screen(void)
138 screens[i].update(); 138 screens[i].update();
139 } 139 }
140 140
141 gui_syncstatusbar_draw(&statusbars, true);
142#ifdef SIMULATOR 141#ifdef SIMULATOR
143 while (button_get(true) & BUTTON_REL); 142 while (button_get(true) & BUTTON_REL);
144#else 143#else
@@ -355,7 +354,6 @@ int charging_screen(void)
355 remote_backlight_set_timeout(global_settings.remote_backlight_timeout); 354 remote_backlight_set_timeout(global_settings.remote_backlight_timeout);
356#endif 355#endif
357 backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); 356 backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged);
358 gui_syncstatusbar_draw(&statusbars, true);
359 357
360#ifdef HAVE_LCD_CHARCELLS 358#ifdef HAVE_LCD_CHARCELLS
361 logo_lock_patterns(true); 359 logo_lock_patterns(true);
@@ -584,7 +582,6 @@ bool set_time_screen(const char* title, struct tm *tm)
584 screens[s].update_viewport(); 582 screens[s].update_viewport();
585 screens[s].set_viewport(NULL); 583 screens[s].set_viewport(NULL);
586 } 584 }
587 gui_syncstatusbar_draw(&statusbars, true);
588 585
589 /* set the most common numbers */ 586 /* set the most common numbers */
590 min = 0; 587 min = 0;
@@ -841,9 +838,7 @@ bool browse_id3(void)
841 gui_synclist_init(&id3_lists, &id3_get_info, &info, true, 2, NULL); 838 gui_synclist_init(&id3_lists, &id3_get_info, &info, true, 2, NULL);
842 gui_synclist_set_nb_items(&id3_lists, info.count*2); 839 gui_synclist_set_nb_items(&id3_lists, info.count*2);
843 gui_synclist_draw(&id3_lists); 840 gui_synclist_draw(&id3_lists);
844 gui_syncstatusbar_draw(&statusbars, true);
845 while (true) { 841 while (true) {
846 gui_syncstatusbar_draw(&statusbars, false);
847 key = get_action(CONTEXT_LIST,HZ/2); 842 key = get_action(CONTEXT_LIST,HZ/2);
848 if(key!=ACTION_NONE && key!=ACTION_UNKNOWN 843 if(key!=ACTION_NONE && key!=ACTION_UNKNOWN
849 && !gui_synclist_do_button(&id3_lists, &key,LIST_WRAP_UNLESS_HELD)) 844 && !gui_synclist_do_button(&id3_lists, &key,LIST_WRAP_UNLESS_HELD))
@@ -916,7 +911,6 @@ bool view_runtime(void)
916 } 911 }
917 lasttime = current_tick; 912 lasttime = current_tick;
918 gui_synclist_draw(&lists); 913 gui_synclist_draw(&lists);
919 gui_syncstatusbar_draw(&statusbars, true);
920 list_do_action(CONTEXT_STD, HZ, 914 list_do_action(CONTEXT_STD, HZ,
921 &lists, &action, LIST_WRAP_UNLESS_HELD); 915 &lists, &action, LIST_WRAP_UNLESS_HELD);
922 if(action == ACTION_STD_CANCEL) 916 if(action == ACTION_STD_CANCEL)
diff --git a/apps/settings.c b/apps/settings.c
index b6c721ca32..dcd68b6a9c 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -273,7 +273,7 @@ bool settings_load_config(const char* file, bool apply)
273 while (read_line(fd, line, sizeof line) > 0) 273 while (read_line(fd, line, sizeof line) > 0)
274 { 274 {
275 if (!settings_parseline(line, &name, &value)) 275 if (!settings_parseline(line, &name, &value))
276 continue; 276 continue;
277 for(i=0; i<nb_settings; i++) 277 for(i=0; i<nb_settings; i++)
278 { 278 {
279 if (settings[i].cfg_name == NULL) 279 if (settings[i].cfg_name == NULL)
@@ -316,6 +316,8 @@ bool settings_load_config(const char* file, bool apply)
316 int temp; 316 int temp;
317 if (cfg_string_to_int(i,&temp,value)) 317 if (cfg_string_to_int(i,&temp,value))
318 *(bool*)settings[i].setting = (temp==0?false:true); 318 *(bool*)settings[i].setting = (temp==0?false:true);
319 if (settings[i].bool_setting->option_callback)
320 settings[i].bool_setting->option_callback(temp==0?false:true);
319 break; 321 break;
320 } 322 }
321 case F_T_CHARPTR: 323 case F_T_CHARPTR:
diff --git a/apps/settings_list.c b/apps/settings_list.c
index e3874566ac..18bcb8ea2c 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -52,6 +52,7 @@
52#ifdef IPOD_ACCESSORY_PROTOCOL 52#ifdef IPOD_ACCESSORY_PROTOCOL
53#include "iap.h" 53#include "iap.h"
54#endif 54#endif
55#include "statusbar.h"
55 56
56#define NVRAM(bytes) (bytes<<F_NVRAM_MASK_SHIFT) 57#define NVRAM(bytes) (bytes<<F_NVRAM_MASK_SHIFT)
57/** NOTE: NVRAM_CONFIG_VERSION is in settings_list.h 58/** NOTE: NVRAM_CONFIG_VERSION is in settings_list.h
@@ -545,7 +546,7 @@ const struct settings_list settings[] = {
545 ID2P(LANG_INVERT_CURSOR_BAR)), 546 ID2P(LANG_INVERT_CURSOR_BAR)),
546 #endif 547 #endif
547 OFFON_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar, 548 OFFON_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
548 LANG_STATUS_BAR, true,"statusbar", NULL), 549 LANG_STATUS_BAR, true,"statusbar", gui_statusbar_changed),
549 OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL), 550 OFFON_SETTING(0,scrollbar, LANG_SCROLL_BAR, true,"scrollbar", NULL),
550#if CONFIG_KEYPAD == RECORDER_PAD 551#if CONFIG_KEYPAD == RECORDER_PAD
551 OFFON_SETTING(0,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL), 552 OFFON_SETTING(0,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL),
diff --git a/apps/tree.c b/apps/tree.c
index a3765d74d3..6e05cb5eb0 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -473,7 +473,6 @@ static int update_dir(void)
473#endif 473#endif
474 gui_synclist_draw(&tree_lists); 474 gui_synclist_draw(&tree_lists);
475 gui_synclist_speak_item(&tree_lists); 475 gui_synclist_speak_item(&tree_lists);
476 gui_syncstatusbar_draw(&statusbars, true);
477 return tc.filesindir; 476 return tc.filesindir;
478} 477}
479 478
@@ -600,7 +599,7 @@ static int dirbrowse()
600{ 599{
601 int numentries=0; 600 int numentries=0;
602 char buf[MAX_PATH]; 601 char buf[MAX_PATH];
603 unsigned button, oldbutton; 602 int button, oldbutton;
604 bool reload_root = false; 603 bool reload_root = false;
605 int lastfilter = *tc.dirfilter; 604 int lastfilter = *tc.dirfilter;
606 bool lastsortcase = global_settings.sort_case; 605 bool lastsortcase = global_settings.sort_case;
@@ -797,10 +796,6 @@ static int dirbrowse()
797 break; 796 break;
798 } 797 }
799 798
800 case ACTION_NONE:
801 gui_syncstatusbar_draw(&statusbars, false);
802 break;
803
804#ifdef HAVE_HOTSWAP 799#ifdef HAVE_HOTSWAP
805 case SYS_FS_CHANGED: 800 case SYS_FS_CHANGED:
806#ifdef HAVE_TAGCACHE 801#ifdef HAVE_TAGCACHE
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 9dfebf6e38..6c0e2b940f 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -368,7 +368,6 @@ long button_get_w_tmo(int ticks)
368 ev.id = BUTTON_NONE; 368 ev.id = BUTTON_NONE;
369 else 369 else
370 button_data = ev.data; 370 button_data = ev.data;
371
372 return ev.id; 371 return ev.id;
373} 372}
374 373
diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h
index 29cf8f2eb9..5cebb29847 100644
--- a/firmware/export/kernel.h
+++ b/firmware/export/kernel.h
@@ -80,6 +80,7 @@
80#define SYS_CAR_ADAPTER_RESUME MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 1) 80#define SYS_CAR_ADAPTER_RESUME MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 1)
81#define SYS_IAP_PERIODIC MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 2) 81#define SYS_IAP_PERIODIC MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 2)
82#define SYS_IAP_HANDLEPKT MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 3) 82#define SYS_IAP_HANDLEPKT MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 3)
83#define SYS_FOURHERTZ MAKE_SYS_EVENT(SYS_EVENT_CLS_MISC, 4)
83 84
84#define IS_SYSEVENT(ev) ((ev & SYS_EVENT) == SYS_EVENT) 85#define IS_SYSEVENT(ev) ((ev & SYS_EVENT) == SYS_EVENT)
85 86