summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-09-07 17:37:06 +0000
committerThomas Martitz <kugel@rockbox.org>2009-09-07 17:37:06 +0000
commit2eb1cb6f826a6542b3947f36a57130de235e530e (patch)
treed6ade8f11719173c858f606ad123240a72abc553
parent47611321c0adafa4125070ac83aa56817504e579 (diff)
downloadrockbox-2eb1cb6f826a6542b3947f36a57130de235e530e.tar.gz
rockbox-2eb1cb6f826a6542b3947f36a57130de235e530e.zip
Fix buttonbar handling/theme changed handling in lists.
The lists need to copy to a local parent if a list passes NULL as parent in the init. This was before the commit of custom ui vp, but I removed it since I (wrongly) thought using the ui vp as parent would be fine. Let the viewportmanager fire a event in case when a theme-related setting changed and simply the handling in the lists code. However the buttonbar handling didn't work before anyway, since list code didn't know if the buttonbar was active (it asked a variable which was always false....). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22651 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/appevents.h1
-rw-r--r--apps/gui/list.c61
-rw-r--r--apps/gui/list.h1
-rw-r--r--apps/gui/viewport.c13
-rw-r--r--apps/gui/viewport.h5
-rw-r--r--apps/main.c3
-rw-r--r--apps/menus/theme_menu.c19
-rw-r--r--apps/screen_access.c9
8 files changed, 78 insertions, 34 deletions
diff --git a/apps/appevents.h b/apps/appevents.h
index f7e695d4a9..d3f7a2d194 100644
--- a/apps/appevents.h
+++ b/apps/appevents.h
@@ -51,6 +51,7 @@ enum {
51 GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1), 51 GUI_EVENT_STATUSBAR_TOGGLE = (EVENT_CLASS_GUI|1),
52 GUI_EVENT_ACTIONUPDATE, 52 GUI_EVENT_ACTIONUPDATE,
53 GUI_EVENT_REFRESH, 53 GUI_EVENT_REFRESH,
54 GUI_EVENT_THEME_CHANGED,
54}; 55};
55 56
56#endif 57#endif
diff --git a/apps/gui/list.c b/apps/gui/list.c
index 9b139dd47c..284b83012a 100644
--- a/apps/gui/list.c
+++ b/apps/gui/list.c
@@ -38,6 +38,7 @@
38#include "misc.h" 38#include "misc.h"
39#include "talk.h" 39#include "talk.h"
40#include "viewport.h" 40#include "viewport.h"
41#include "appevents.h"
41 42
42#ifdef HAVE_LCD_CHARCELLS 43#ifdef HAVE_LCD_CHARCELLS
43#define SCROLL_LIMIT 1 44#define SCROLL_LIMIT 1
@@ -61,21 +62,41 @@ static void gui_list_select_at_offset(struct gui_synclist * gui_list,
61void list_draw(struct screen *display, struct gui_synclist *list); 62void list_draw(struct screen *display, struct gui_synclist *list);
62 63
63#ifdef HAVE_LCD_BITMAP 64#ifdef HAVE_LCD_BITMAP
65static int list_need_reinit = false;
66static struct viewport parent[NB_SCREENS];
67
68static void list_force_reinit(void *param)
69{
70 (void)param;
71 list_need_reinit = true;
72}
73
74void list_init(void)
75{
76 add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit);
77}
78
64static void list_init_viewports(struct gui_synclist *list) 79static void list_init_viewports(struct gui_synclist *list)
65{ 80{
66 struct viewport* vp; 81 int i, parent_used;
67 int i; 82
68 bool parent_used = (*list->parent != NULL); 83 if (!list)
84 return;
85
86 parent_used = (*list->parent != &parent[SCREEN_MAIN]);
87
69 if (!parent_used) 88 if (!parent_used)
70 { 89 {
71 vp = viewport_get_current_vp();
72 FOR_NB_SCREENS(i) 90 FOR_NB_SCREENS(i)
73 list->parent[i] = &vp[i]; 91 {
74 } 92 list->parent[i] = &parent[i];
93 viewport_set_defaults(&parent[i], i);
75#ifdef HAVE_BUTTONBAR 94#ifdef HAVE_BUTTONBAR
76 if (list && !parent_used && global_settings.buttonbar) 95 if (screens[i].has_buttonbar && !viewport_ui_vp_get_state(i))
77 list->parent[0]->height -= BUTTONBAR_HEIGHT; 96 list->parent[i]->height -= BUTTONBAR_HEIGHT;
78#endif 97#endif
98 }
99 }
79} 100}
80#else 101#else
81#define list_init_viewports(a) 102#define list_init_viewports(a)
@@ -135,12 +156,7 @@ void gui_synclist_init(struct gui_synclist * gui_list,
135 if (list_parent) 156 if (list_parent)
136 gui_list->parent[i] = &list_parent[i]; 157 gui_list->parent[i] = &list_parent[i];
137 else 158 else
138 gui_list->parent[i] = 159 gui_list->parent[i] = &parent[i];
139#ifdef HAVE_LCD_BITMAP
140 NULL;
141#else
142 &parent[i];
143#endif
144 } 160 }
145 list_init_viewports(gui_list); 161 list_init_viewports(gui_list);
146 gui_list->limit_scroll = false; 162 gui_list->limit_scroll = false;
@@ -209,26 +225,13 @@ int gui_list_get_item_offset(struct gui_synclist * gui_list,
209void gui_synclist_draw(struct gui_synclist *gui_list) 225void gui_synclist_draw(struct gui_synclist *gui_list)
210{ 226{
211 int i; 227 int i;
212 static struct gui_synclist *last_list = NULL; 228#ifdef HAVE_LCD_BITMAP
213 static int last_count = -1; 229 if (list_need_reinit)
214#ifdef HAVE_BUTTONBAR
215 static bool last_buttonbar = false;
216#endif
217 if (
218#ifdef HAVE_BUTTONBAR
219 last_buttonbar != screens[SCREEN_MAIN].has_buttonbar ||
220#endif
221 last_list != gui_list ||
222 gui_list->nb_items != last_count)
223 { 230 {
224 list_init_viewports(gui_list); 231 list_init_viewports(gui_list);
225 gui_synclist_select_item(gui_list, gui_list->selected_item); 232 gui_synclist_select_item(gui_list, gui_list->selected_item);
226 } 233 }
227#ifdef HAVE_BUTTONBAR
228 last_buttonbar = screens[SCREEN_MAIN].has_buttonbar;
229#endif 234#endif
230 last_count = gui_list->nb_items;
231 last_list = gui_list;
232 FOR_NB_SCREENS(i) 235 FOR_NB_SCREENS(i)
233 { 236 {
234 list_draw(&screens[i], gui_list); 237 list_draw(&screens[i], gui_list);
diff --git a/apps/gui/list.h b/apps/gui/list.h
index 8a36acb005..ed61889083 100644
--- a/apps/gui/list.h
+++ b/apps/gui/list.h
@@ -132,6 +132,7 @@ struct gui_synclist
132 132
133 133
134#ifdef HAVE_LCD_BITMAP 134#ifdef HAVE_LCD_BITMAP
135extern void list_init(void);
135/* parse global setting to static int */ 136/* parse global setting to static int */
136extern void gui_list_screen_scroll_step(int ofs); 137extern void gui_list_screen_scroll_step(int ofs);
137 138
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index 63f0b8fc20..281c04b2c5 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -208,6 +208,13 @@ static void statusbar_toggled(void* param)
208void viewportmanager_theme_changed(int which) 208void viewportmanager_theme_changed(int which)
209{ 209{
210 int i; 210 int i;
211#ifdef HAVE_BUTTONBAR
212 if (which & THEME_BUTTONBAR)
213 { /* don't handle further, the custom ui viewport ignores the buttonbar,
214 * as does viewport_set_defaults(), since only lists use it*/
215 screens[SCREEN_MAIN].has_buttonbar = global_settings.buttonbar;
216 }
217#endif
211 if (which & THEME_UI_VIEWPORT) 218 if (which & THEME_UI_VIEWPORT)
212 { 219 {
213 int retval = viewport_init_ui_vp(); 220 int retval = viewport_init_ui_vp();
@@ -245,6 +252,7 @@ void viewportmanager_theme_changed(int which)
245 viewport_set_fullscreen(&custom_vp[i], i); 252 viewport_set_fullscreen(&custom_vp[i], i);
246 } 253 }
247 } 254 }
255 send_event(GUI_EVENT_THEME_CHANGED, NULL);
248} 256}
249 257
250static void viewportmanager_ui_vp_changed(void *param) 258static void viewportmanager_ui_vp_changed(void *param)
@@ -279,6 +287,11 @@ struct viewport* viewport_get_current_vp(void)
279 return ui_vp_info.vp; 287 return ui_vp_info.vp;
280} 288}
281 289
290bool viewport_ui_vp_get_state(enum screen_type screen)
291{
292 return ui_vp_info.active[screen];
293}
294
282#ifdef HAVE_LCD_COLOR 295#ifdef HAVE_LCD_COLOR
283#define ARG_STRING(_depth) ((_depth) == 2 ? "dddddgg":"dddddcc") 296#define ARG_STRING(_depth) ((_depth) == 2 ? "dddddgg":"dddddcc")
284#else 297#else
diff --git a/apps/gui/viewport.h b/apps/gui/viewport.h
index 93b5c70fc3..d431766ab5 100644
--- a/apps/gui/viewport.h
+++ b/apps/gui/viewport.h
@@ -58,6 +58,7 @@ void viewport_set_defaults(struct viewport *vp, enum screen_type screen);
58 58
59#define THEME_STATUSBAR (BIT_N(0)) 59#define THEME_STATUSBAR (BIT_N(0))
60#define THEME_UI_VIEWPORT (BIT_N(1)) 60#define THEME_UI_VIEWPORT (BIT_N(1))
61#define THEME_BUTTONBAR (BIT_N(2))
61#define THEME_ALL (~(0u)) 62#define THEME_ALL (~(0u))
62 63
63#define VP_SB_HIDE_ALL 0 64#define VP_SB_HIDE_ALL 0
@@ -116,6 +117,10 @@ struct viewport* viewport_get_current_vp(void);
116 */ 117 */
117void viewport_set_current_vp(struct viewport* vp); 118void viewport_set_current_vp(struct viewport* vp);
118 119
120/*
121 * returns true if the ui viewport is active on the screen
122 */
123bool viewport_ui_vp_get_state(enum screen_type screen);
119#ifdef HAVE_TOUCHSCREEN 124#ifdef HAVE_TOUCHSCREEN
120bool viewport_point_within_vp(const struct viewport *vp, int x, int y); 125bool viewport_point_within_vp(const struct viewport *vp, int x, int y);
121#endif 126#endif
diff --git a/apps/main.c b/apps/main.c
index 6aa16e5cb6..c7510801d4 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -135,6 +135,9 @@ static void app_main(void)
135 screens[i].clear_display(); 135 screens[i].clear_display();
136 screens[i].update(); 136 screens[i].update();
137 } 137 }
138#ifdef HAVE_LCD_BITMAP
139 list_init();
140#endif
138 tree_gui_init(); 141 tree_gui_init();
139 gui_syncstatusbar_init(&statusbars); 142 gui_syncstatusbar_init(&statusbars);
140 viewportmanager_init(); 143 viewportmanager_init();
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c
index b4505de4b3..38e052b262 100644
--- a/apps/menus/theme_menu.c
+++ b/apps/menus/theme_menu.c
@@ -38,6 +38,7 @@
38#include "backdrop.h" 38#include "backdrop.h"
39#include "exported_menus.h" 39#include "exported_menus.h"
40#include "appevents.h" 40#include "appevents.h"
41#include "viewport.h"
41 42
42#if LCD_DEPTH > 1 43#if LCD_DEPTH > 1
43/** 44/**
@@ -177,6 +178,20 @@ static int statusbar_callback(int action,const struct menu_item_ex *this_item)
177{ 178{
178 return statusbar_callback_ex(action, this_item, SCREEN_MAIN); 179 return statusbar_callback_ex(action, this_item, SCREEN_MAIN);
179} 180}
181
182#ifdef HAVE_BUTTONBAR
183static int buttonbar_callback(int action, const struct menu_item_ex *this_item)
184{
185 (void)this_item;
186 switch (action)
187 {
188 case ACTION_EXIT_MENUITEM:
189 viewportmanager_theme_changed(THEME_BUTTONBAR);
190 break;
191 }
192 return ACTION_REDRAW;
193}
194#endif
180MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL); 195MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
181MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL); 196MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL);
182MENUITEM_SETTING(statusbar, &global_settings.statusbar, 197MENUITEM_SETTING(statusbar, &global_settings.statusbar,
@@ -185,8 +200,8 @@ MENUITEM_SETTING(statusbar, &global_settings.statusbar,
185MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, 200MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar,
186 statusbar_callback_remote); 201 statusbar_callback_remote);
187#endif 202#endif
188#if CONFIG_KEYPAD == RECORDER_PAD 203#ifdef HAVE_BUTTONBAR
189MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL); 204MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, buttonbar_callback);
190#endif 205#endif
191MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL); 206MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL);
192MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL); 207MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL);
diff --git a/apps/screen_access.c b/apps/screen_access.c
index d0b483f3f4..5b2b4724f1 100644
--- a/apps/screen_access.c
+++ b/apps/screen_access.c
@@ -56,7 +56,7 @@ static int screen_helper_getnblines(void)
56{ 56{
57 int height=screens[0].lcdheight; 57 int height=screens[0].lcdheight;
58#ifdef HAVE_LCD_BITMAP 58#ifdef HAVE_LCD_BITMAP
59 if(global_settings.statusbar) 59 if(global_settings.statusbar != STATUSBAR_OFF)
60 height -= STATUSBAR_HEIGHT; 60 height -= STATUSBAR_HEIGHT;
61#ifdef HAVE_BUTTONBAR 61#ifdef HAVE_BUTTONBAR
62 if(global_settings.buttonbar && screens[0].has_buttonbar) 62 if(global_settings.buttonbar && screens[0].has_buttonbar)
@@ -89,10 +89,10 @@ static int screen_helper_remote_getnblines(void)
89{ 89{
90 int height=screens[1].lcdheight; 90 int height=screens[1].lcdheight;
91#ifdef HAVE_LCD_BITMAP 91#ifdef HAVE_LCD_BITMAP
92 if(global_settings.statusbar) 92 if(global_settings.statusbar != STATUSBAR_OFF)
93 height -= STATUSBAR_HEIGHT; 93 height -= STATUSBAR_HEIGHT;
94#ifdef HAVE_BUTTONBAR 94#ifdef HAVE_BUTTONBAR
95 if(global_settings.buttonbar && screens[0].has_buttonbar) 95 if(global_settings.buttonbar && screens[1].has_buttonbar)
96 height -= BUTTONBAR_HEIGHT; 96 height -= BUTTONBAR_HEIGHT;
97#endif 97#endif
98#endif 98#endif
@@ -286,6 +286,9 @@ struct screen screens[NB_SCREENS] =
286 .backdrop_load=&remote_backdrop_load, 286 .backdrop_load=&remote_backdrop_load,
287 .backdrop_unload=&remote_backdrop_unload, 287 .backdrop_unload=&remote_backdrop_unload,
288 .backdrop_show=&remote_backdrop_show, 288 .backdrop_show=&remote_backdrop_show,
289#ifdef HAVE_BUTTONBAR
290 .has_buttonbar=false,
291#endif
289 } 292 }
290#endif /* HAVE_REMOTE_LCD */ 293#endif /* HAVE_REMOTE_LCD */
291}; 294};