diff options
author | Thomas Martitz <kugel@rockbox.org> | 2009-09-07 17:37:06 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2009-09-07 17:37:06 +0000 |
commit | 2eb1cb6f826a6542b3947f36a57130de235e530e (patch) | |
tree | d6ade8f11719173c858f606ad123240a72abc553 | |
parent | 47611321c0adafa4125070ac83aa56817504e579 (diff) | |
download | rockbox-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.h | 1 | ||||
-rw-r--r-- | apps/gui/list.c | 61 | ||||
-rw-r--r-- | apps/gui/list.h | 1 | ||||
-rw-r--r-- | apps/gui/viewport.c | 13 | ||||
-rw-r--r-- | apps/gui/viewport.h | 5 | ||||
-rw-r--r-- | apps/main.c | 3 | ||||
-rw-r--r-- | apps/menus/theme_menu.c | 19 | ||||
-rw-r--r-- | apps/screen_access.c | 9 |
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, | |||
61 | void list_draw(struct screen *display, struct gui_synclist *list); | 62 | void list_draw(struct screen *display, struct gui_synclist *list); |
62 | 63 | ||
63 | #ifdef HAVE_LCD_BITMAP | 64 | #ifdef HAVE_LCD_BITMAP |
65 | static int list_need_reinit = false; | ||
66 | static struct viewport parent[NB_SCREENS]; | ||
67 | |||
68 | static void list_force_reinit(void *param) | ||
69 | { | ||
70 | (void)param; | ||
71 | list_need_reinit = true; | ||
72 | } | ||
73 | |||
74 | void list_init(void) | ||
75 | { | ||
76 | add_event(GUI_EVENT_THEME_CHANGED, false, list_force_reinit); | ||
77 | } | ||
78 | |||
64 | static void list_init_viewports(struct gui_synclist *list) | 79 | static 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, | |||
209 | void gui_synclist_draw(struct gui_synclist *gui_list) | 225 | void 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 |
135 | extern void list_init(void); | ||
135 | /* parse global setting to static int */ | 136 | /* parse global setting to static int */ |
136 | extern void gui_list_screen_scroll_step(int ofs); | 137 | extern 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) | |||
208 | void viewportmanager_theme_changed(int which) | 208 | void 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 | ||
250 | static void viewportmanager_ui_vp_changed(void *param) | 258 | static 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 | ||
290 | bool 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 | */ |
117 | void viewport_set_current_vp(struct viewport* vp); | 118 | void viewport_set_current_vp(struct viewport* vp); |
118 | 119 | ||
120 | /* | ||
121 | * returns true if the ui viewport is active on the screen | ||
122 | */ | ||
123 | bool viewport_ui_vp_get_state(enum screen_type screen); | ||
119 | #ifdef HAVE_TOUCHSCREEN | 124 | #ifdef HAVE_TOUCHSCREEN |
120 | bool viewport_point_within_vp(const struct viewport *vp, int x, int y); | 125 | bool 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 | ||
183 | static 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 | ||
180 | MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL); | 195 | MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL); |
181 | MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL); | 196 | MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL); |
182 | MENUITEM_SETTING(statusbar, &global_settings.statusbar, | 197 | MENUITEM_SETTING(statusbar, &global_settings.statusbar, |
@@ -185,8 +200,8 @@ MENUITEM_SETTING(statusbar, &global_settings.statusbar, | |||
185 | MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, | 200 | MENUITEM_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 |
189 | MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL); | 204 | MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, buttonbar_callback); |
190 | #endif | 205 | #endif |
191 | MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL); | 206 | MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL); |
192 | MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL); | 207 | MENUITEM_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 | }; |