diff options
author | Teruaki Kawashima <teru@rockbox.org> | 2010-02-11 10:41:06 +0000 |
---|---|---|
committer | Teruaki Kawashima <teru@rockbox.org> | 2010-02-11 10:41:06 +0000 |
commit | 93f9e7cbfb3905791feccb4da68f6cc969d1e148 (patch) | |
tree | fb6e01220844fa1c0a9f92643ccaddb70fcb66b4 /apps/menu.c | |
parent | 0a291fff12c27ba6b46521ecaf126bdb4726c24e (diff) | |
download | rockbox-93f9e7cbfb3905791feccb4da68f6cc969d1e148.tar.gz rockbox-93f9e7cbfb3905791feccb4da68f6cc969d1e148.zip |
fix text scrolling handling in do_menu, set_time_screen and time_screen.
Don't scroll text in time_screen(). the lines will be redrawn before scrolling statrs, so they don't scroll anyway.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24591 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/menu.c')
-rw-r--r-- | apps/menu.c | 66 |
1 files changed, 28 insertions, 38 deletions
diff --git a/apps/menu.c b/apps/menu.c index eb29b43f3b..eb4bf0e1c9 100644 --- a/apps/menu.c +++ b/apps/menu.c | |||
@@ -73,7 +73,7 @@ static void get_menu_callback(const struct menu_item_ex *m, | |||
73 | { | 73 | { |
74 | if (m->flags&(MENU_HAS_DESC|MENU_DYNAMIC_DESC)) | 74 | if (m->flags&(MENU_HAS_DESC|MENU_DYNAMIC_DESC)) |
75 | *menu_callback= m->callback_and_desc->menu_callback; | 75 | *menu_callback= m->callback_and_desc->menu_callback; |
76 | else | 76 | else |
77 | *menu_callback = m->menu_callback; | 77 | *menu_callback = m->menu_callback; |
78 | } | 78 | } |
79 | 79 | ||
@@ -101,7 +101,7 @@ static const char* get_menu_item_name(int selected_item, | |||
101 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; | 101 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; |
102 | int type = (menu->flags&MENU_TYPE_MASK); | 102 | int type = (menu->flags&MENU_TYPE_MASK); |
103 | selected_item = get_menu_selection(selected_item, menu); | 103 | selected_item = get_menu_selection(selected_item, menu); |
104 | 104 | ||
105 | (void)buffer_len; | 105 | (void)buffer_len; |
106 | /* only MT_MENU or MT_RETURN_ID is allowed in here */ | 106 | /* only MT_MENU or MT_RETURN_ID is allowed in here */ |
107 | if (type == MT_RETURN_ID) | 107 | if (type == MT_RETURN_ID) |
@@ -111,13 +111,13 @@ static const char* get_menu_item_name(int selected_item, | |||
111 | menu->menu_get_name_and_icon->list_get_name_data, buffer); | 111 | menu->menu_get_name_and_icon->list_get_name_data, buffer); |
112 | return menu->strings[selected_item]; | 112 | return menu->strings[selected_item]; |
113 | } | 113 | } |
114 | 114 | ||
115 | menu = menu->submenus[selected_item]; | 115 | menu = menu->submenus[selected_item]; |
116 | 116 | ||
117 | if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT)) | 117 | if ((menu->flags&MENU_DYNAMIC_DESC) && (type != MT_SETTING_W_TEXT)) |
118 | return menu->menu_get_name_and_icon->list_get_name(selected_item, | 118 | return menu->menu_get_name_and_icon->list_get_name(selected_item, |
119 | menu->menu_get_name_and_icon->list_get_name_data, buffer); | 119 | menu->menu_get_name_and_icon->list_get_name_data, buffer); |
120 | 120 | ||
121 | type = (menu->flags&MENU_TYPE_MASK); | 121 | type = (menu->flags&MENU_TYPE_MASK); |
122 | if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT)) | 122 | if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT)) |
123 | { | 123 | { |
@@ -135,7 +135,7 @@ static enum themable_icons menu_get_icon(int selected_item, void * data) | |||
135 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; | 135 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; |
136 | int menu_icon = Icon_NOICON; | 136 | int menu_icon = Icon_NOICON; |
137 | selected_item = get_menu_selection(selected_item, menu); | 137 | selected_item = get_menu_selection(selected_item, menu); |
138 | 138 | ||
139 | if ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID) | 139 | if ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID) |
140 | { | 140 | { |
141 | return Icon_Menu_functioncall; | 141 | return Icon_Menu_functioncall; |
@@ -145,7 +145,7 @@ static enum themable_icons menu_get_icon(int selected_item, void * data) | |||
145 | menu_icon = menu->callback_and_desc->icon_id; | 145 | menu_icon = menu->callback_and_desc->icon_id; |
146 | else if (menu->flags&MENU_DYNAMIC_DESC) | 146 | else if (menu->flags&MENU_DYNAMIC_DESC) |
147 | menu_icon = menu->menu_get_name_and_icon->icon_id; | 147 | menu_icon = menu->menu_get_name_and_icon->icon_id; |
148 | 148 | ||
149 | if (menu_icon == Icon_NOICON) | 149 | if (menu_icon == Icon_NOICON) |
150 | { | 150 | { |
151 | switch (menu->flags&MENU_TYPE_MASK) | 151 | switch (menu->flags&MENU_TYPE_MASK) |
@@ -194,7 +194,7 @@ static void init_menu_lists(const struct menu_item_ex *menu, | |||
194 | current_subitems_count++; | 194 | current_subitems_count++; |
195 | } | 195 | } |
196 | } | 196 | } |
197 | else | 197 | else |
198 | { | 198 | { |
199 | current_subitems[current_subitems_count] = i; | 199 | current_subitems[current_subitems_count] = i; |
200 | current_subitems_count++; | 200 | current_subitems_count++; |
@@ -219,7 +219,7 @@ static void init_menu_lists(const struct menu_item_ex *menu, | |||
219 | gui_synclist_set_nb_items(lists,current_subitems_count); | 219 | gui_synclist_set_nb_items(lists,current_subitems_count); |
220 | gui_synclist_limit_scroll(lists,true); | 220 | gui_synclist_limit_scroll(lists,true); |
221 | gui_synclist_select_item(lists, find_menu_selection(selected)); | 221 | gui_synclist_select_item(lists, find_menu_selection(selected)); |
222 | 222 | ||
223 | get_menu_callback(menu,&menu_callback); | 223 | get_menu_callback(menu,&menu_callback); |
224 | if (callback && menu_callback) | 224 | if (callback && menu_callback) |
225 | menu_callback(ACTION_ENTER_MENUITEM,menu); | 225 | menu_callback(ACTION_ENTER_MENUITEM,menu); |
@@ -234,13 +234,13 @@ static int talk_menu_item(int selected_item, void *data) | |||
234 | int type; | 234 | int type; |
235 | unsigned char *str; | 235 | unsigned char *str; |
236 | int sel = get_menu_selection(selected_item, menu); | 236 | int sel = get_menu_selection(selected_item, menu); |
237 | 237 | ||
238 | if ((menu->flags&MENU_TYPE_MASK) == MT_MENU) | 238 | if ((menu->flags&MENU_TYPE_MASK) == MT_MENU) |
239 | { | 239 | { |
240 | type = menu->submenus[sel]->flags&MENU_TYPE_MASK; | 240 | type = menu->submenus[sel]->flags&MENU_TYPE_MASK; |
241 | if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT)) | 241 | if ((type == MT_SETTING) || (type == MT_SETTING_W_TEXT)) |
242 | talk_setting(menu->submenus[sel]->variable); | 242 | talk_setting(menu->submenus[sel]->variable); |
243 | else | 243 | else |
244 | { | 244 | { |
245 | if (menu->submenus[sel]->flags&(MENU_DYNAMIC_DESC)) | 245 | if (menu->submenus[sel]->flags&(MENU_DYNAMIC_DESC)) |
246 | { | 246 | { |
@@ -264,7 +264,7 @@ static int talk_menu_item(int selected_item, void *data) | |||
264 | else | 264 | else |
265 | id = P2ID(menu->submenus[sel]->callback_and_desc->desc); | 265 | id = P2ID(menu->submenus[sel]->callback_and_desc->desc); |
266 | if (id != -1) | 266 | if (id != -1) |
267 | talk_id(id,false); | 267 | talk_id(id,false); |
268 | } | 268 | } |
269 | } | 269 | } |
270 | else if(((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID)) | 270 | else if(((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID)) |
@@ -285,9 +285,8 @@ void do_setting_from_menu(const struct menu_item_ex *temp, | |||
285 | struct viewport parent[NB_SCREENS]) | 285 | struct viewport parent[NB_SCREENS]) |
286 | { | 286 | { |
287 | int setting_id, oldval; | 287 | int setting_id, oldval; |
288 | const struct settings_list *setting = find_setting( | 288 | const struct settings_list *setting = |
289 | temp->variable, | 289 | find_setting(temp->variable, &setting_id); |
290 | &setting_id); | ||
291 | char *title; | 290 | char *title; |
292 | char padded_title[MAX_PATH]; | 291 | char padded_title[MAX_PATH]; |
293 | int var_type = setting->flags&F_T_MASK; | 292 | int var_type = setting->flags&F_T_MASK; |
@@ -305,7 +304,7 @@ void do_setting_from_menu(const struct menu_item_ex *temp, | |||
305 | title = temp->callback_and_desc->desc; | 304 | title = temp->callback_and_desc->desc; |
306 | else | 305 | else |
307 | title = ID2P(setting->lang_id); | 306 | title = ID2P(setting->lang_id); |
308 | 307 | ||
309 | /* Pad the title string by repeating it. This is needed | 308 | /* Pad the title string by repeating it. This is needed |
310 | so the scroll settings title can actually be used to | 309 | so the scroll settings title can actually be used to |
311 | test the setting */ | 310 | test the setting */ |
@@ -328,7 +327,7 @@ void do_setting_from_menu(const struct menu_item_ex *temp, | |||
328 | padded_title[i] = '\0'; | 327 | padded_title[i] = '\0'; |
329 | title = padded_title; | 328 | title = padded_title; |
330 | } | 329 | } |
331 | 330 | ||
332 | option_screen((struct settings_list *)setting, parent, | 331 | option_screen((struct settings_list *)setting, parent, |
333 | setting->flags&F_TEMPVAR, title); | 332 | setting->flags&F_TEMPVAR, title); |
334 | } | 333 | } |
@@ -345,7 +344,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
345 | bool redraw_lists; | 344 | bool redraw_lists; |
346 | FOR_NB_SCREENS(i) | 345 | FOR_NB_SCREENS(i) |
347 | viewportmanager_theme_enable(i, !hide_theme, NULL); | 346 | viewportmanager_theme_enable(i, !hide_theme, NULL); |
348 | 347 | ||
349 | const struct menu_item_ex *menu_stack[MAX_MENUS]; | 348 | const struct menu_item_ex *menu_stack[MAX_MENUS]; |
350 | int menu_stack_selected_item[MAX_MENUS]; | 349 | int menu_stack_selected_item[MAX_MENUS]; |
351 | int stack_top = 0; | 350 | int stack_top = 0; |
@@ -370,7 +369,6 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
370 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); | 369 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); |
371 | /* load the callback, and only reload it if menu changes */ | 370 | /* load the callback, and only reload it if menu changes */ |
372 | get_menu_callback(menu, &menu_callback); | 371 | get_menu_callback(menu, &menu_callback); |
373 | |||
374 | 372 | ||
375 | #ifdef HAVE_BUTTONBAR | 373 | #ifdef HAVE_BUTTONBAR |
376 | if (!hide_theme) | 374 | if (!hide_theme) |
@@ -391,7 +389,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
391 | action = get_action(CONTEXT_MAINMENU, | 389 | action = get_action(CONTEXT_MAINMENU, |
392 | list_do_action_timeout(&lists, HZ)); | 390 | list_do_action_timeout(&lists, HZ)); |
393 | /* HZ so the status bar redraws corectly */ | 391 | /* HZ so the status bar redraws corectly */ |
394 | 392 | ||
395 | if (menu_callback) | 393 | if (menu_callback) |
396 | { | 394 | { |
397 | int old_action = action; | 395 | int old_action = action; |
@@ -477,11 +475,10 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
477 | { | 475 | { |
478 | case GO_TO_PREVIOUS: | 476 | case GO_TO_PREVIOUS: |
479 | break; | 477 | break; |
480 | case 0: /* reset setting */ | 478 | case 0: /* reset setting */ |
481 | reset_setting(setting, setting->setting); | 479 | reset_setting(setting, setting->setting); |
482 | break; | ||
483 | #ifdef HAVE_QUICKSCREEN | ||
484 | break; | 480 | break; |
481 | #ifdef HAVE_QUICKSCREEN | ||
485 | case 1: /* set as top QS item */ | 482 | case 1: /* set as top QS item */ |
486 | set_as_qs_item(setting, QUICKSCREEN_TOP); | 483 | set_as_qs_item(setting, QUICKSCREEN_TOP); |
487 | break; | 484 | break; |
@@ -513,10 +510,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
513 | bool exiting_menu = false; | 510 | bool exiting_menu = false; |
514 | in_stringlist = false; | 511 | in_stringlist = false; |
515 | /* might be leaving list, so stop scrolling */ | 512 | /* might be leaving list, so stop scrolling */ |
516 | FOR_NB_SCREENS(i) | 513 | gui_synclist_scroll_stop(&lists); |
517 | { | ||
518 | screens[i].scroll_stop(&vps[i]); | ||
519 | } | ||
520 | if (menu_callback) | 514 | if (menu_callback) |
521 | menu_callback(ACTION_EXIT_MENUITEM, menu); | 515 | menu_callback(ACTION_EXIT_MENUITEM, menu); |
522 | 516 | ||
@@ -546,10 +540,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
546 | { | 540 | { |
547 | int type; | 541 | int type; |
548 | /* entering an item that may not be a list, so stop scrolling */ | 542 | /* entering an item that may not be a list, so stop scrolling */ |
549 | FOR_NB_SCREENS(i) | 543 | gui_synclist_scroll_stop(&lists); |
550 | { | ||
551 | screens[i].scroll_stop(&vps[i]); | ||
552 | } | ||
553 | #ifdef HAVE_BUTTONBAR | 544 | #ifdef HAVE_BUTTONBAR |
554 | if (!hide_theme) | 545 | if (!hide_theme) |
555 | { | 546 | { |
@@ -562,7 +553,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
562 | redraw_lists = true; | 553 | redraw_lists = true; |
563 | if (in_stringlist) | 554 | if (in_stringlist) |
564 | type = (menu->flags&MENU_TYPE_MASK); | 555 | type = (menu->flags&MENU_TYPE_MASK); |
565 | else | 556 | else |
566 | { | 557 | { |
567 | type = (temp->flags&MENU_TYPE_MASK); | 558 | type = (temp->flags&MENU_TYPE_MASK); |
568 | get_menu_callback(temp, &menu_callback); | 559 | get_menu_callback(temp, &menu_callback); |
@@ -592,7 +583,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
592 | if (temp->flags&MENU_FUNC_USEPARAM) | 583 | if (temp->flags&MENU_FUNC_USEPARAM) |
593 | return_value = temp->function->function_w_param( | 584 | return_value = temp->function->function_w_param( |
594 | temp->function->param); | 585 | temp->function->param); |
595 | else | 586 | else |
596 | return_value = temp->function->function(); | 587 | return_value = temp->function->function(); |
597 | if (!(menu->flags&MENU_EXITAFTERTHISMENU) || | 588 | if (!(menu->flags&MENU_EXITAFTERTHISMENU) || |
598 | (temp->flags&MENU_EXITAFTERTHISMENU)) | 589 | (temp->flags&MENU_EXITAFTERTHISMENU)) |
@@ -665,7 +656,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
665 | ret = MENU_ATTACHED_USB; | 656 | ret = MENU_ATTACHED_USB; |
666 | done = true; | 657 | done = true; |
667 | } | 658 | } |
668 | 659 | ||
669 | if (redraw_lists && !done) | 660 | if (redraw_lists && !done) |
670 | { | 661 | { |
671 | if (menu_callback) | 662 | if (menu_callback) |
@@ -686,8 +677,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
686 | *start_selected = get_menu_selection( | 677 | *start_selected = get_menu_selection( |
687 | gui_synclist_get_sel_pos(&lists), menu); | 678 | gui_synclist_get_sel_pos(&lists), menu); |
688 | } | 679 | } |
689 | FOR_NB_SCREENS(i) | 680 | FOR_NB_SCREENS(i) |
690 | viewportmanager_theme_undo(i, false); | 681 | viewportmanager_theme_undo(i, false); |
691 | return ret; | 682 | return ret; |
692 | } | 683 | } |
693 | |||