/***************** User Interface Functions *****************/ int wait_for_button(void) { int button; do { button = rb->button_get(true); } while (IS_SYSEVENT(button) || (button & BUTTON_REL)); return button; }
static int WaitForButton(void) { int button; do { button = rb->button_get(true); } while (IS_SYSEVENT(button) || (button & BUTTON_REL)); return button; }
static bool show_credits(void) { char credits[MAX_PATH] = { '\0' }; snprintf(credits, MAX_PATH, "%s/credits.rock", VIEWERS_DIR); if (plugin_load(credits, NULL) != PLUGIN_OK) { /* show the rockbox logo and version untill a button is pressed */ show_logo(); while (IS_SYSEVENT(get_action(CONTEXT_STD, TIMEOUT_BLOCK))) ; } return false; }
/* main loop, handles key events */ static int dirbrowse(void) { int numentries=0; char buf[MAX_PATH]; int button, oldbutton; bool reload_root = false; int lastfilter = *tc.dirfilter; bool lastsortcase = global_settings.sort_case; bool exit_func = false; char* currdir = tc.currdir; /* just a shortcut */ #ifdef HAVE_TAGCACHE bool id3db = *tc.dirfilter == SHOW_ID3DB; if (id3db) curr_context=CONTEXT_ID3DB; else #endif curr_context=CONTEXT_TREE; if (tc.selected_item < 0) tc.selected_item = 0; #ifdef HAVE_TAGCACHE tc.firstpos = 0; lasttable = -1; lastextra = -1; lastfirstpos = 0; #endif start_wps = false; numentries = update_dir(); reload_dir = false; if (numentries == -1) return GO_TO_PREVIOUS; /* currdir is not a directory */ if (*tc.dirfilter > NUM_FILTER_MODES && numentries==0) { splash(HZ*2, ID2P(LANG_NO_FILES)); return GO_TO_PREVIOUS; /* No files found for rockbox_browse() */ } gui_synclist_draw(&tree_lists); while(1) { bool restore = false; if (tc.dirlevel < 0) tc.dirlevel = 0; /* shouldnt be needed.. this code needs work! */ button = get_action(CONTEXT_TREE, list_do_action_timeout(&tree_lists, HZ/2)); oldbutton = button; gui_synclist_do_button(&tree_lists, &button,LIST_WRAP_UNLESS_HELD); tc.selected_item = gui_synclist_get_sel_pos(&tree_lists); switch ( button ) { case ACTION_STD_OK: /* nothing to do if no files to display */ if ( numentries == 0 ) break; short attr = tree_get_entry_at(&tc, tc.selected_item)->attr; if ((tc.browse->flags & BROWSE_SELECTONLY) && !(attr & ATTR_DIRECTORY)) { tc.browse->flags |= BROWSE_SELECTED; get_current_file(tc.browse->buf, tc.browse->bufsize); return GO_TO_PREVIOUS; } #ifdef HAVE_TAGCACHE switch (id3db?tagtree_enter(&tc):ft_enter(&tc)) #else switch (ft_enter(&tc)) #endif { case GO_TO_FILEBROWSER: reload_dir = true; break; case GO_TO_WPS: return GO_TO_WPS; #if CONFIG_TUNER case GO_TO_FM: return GO_TO_FM; #endif case GO_TO_ROOT: exit_func = true; break; default: break; } restore = true; break; case ACTION_STD_CANCEL: if (*tc.dirfilter > NUM_FILTER_MODES && tc.dirlevel < 1) { exit_func = true; break; } if ((*tc.dirfilter == SHOW_ID3DB && tc.dirlevel == 0) || ((*tc.dirfilter != SHOW_ID3DB && !strcmp(currdir,"/")))) { #ifdef HAVE_LCD_BITMAP /* charcell doesnt have ACTION_TREE_PGLEFT so this isnt needed */ if (oldbutton == ACTION_TREE_PGLEFT) break; else #endif return GO_TO_ROOT; } #ifdef HAVE_TAGCACHE if (id3db) tagtree_exit(&tc); else #endif if (ft_exit(&tc) == 3) exit_func = true; restore = true; break; case ACTION_TREE_STOP: if (list_stop_handler()) restore = true; break; case ACTION_STD_MENU: return GO_TO_ROOT; break; #ifdef HAVE_RECORDING case ACTION_STD_REC: return GO_TO_RECSCREEN; #endif case ACTION_TREE_WPS: return GO_TO_PREVIOUS_MUSIC; break; #ifdef HAVE_QUICKSCREEN case ACTION_STD_QUICKSCREEN: /* don't enter f2 from plugin browser */ if (*tc.dirfilter < NUM_FILTER_MODES) { if (quick_screen_quick(button)) reload_dir = true; restore = true; } break; #endif #ifdef BUTTON_F3 case ACTION_F3: /* don't enter f3 from plugin browser */ if (*tc.dirfilter < NUM_FILTER_MODES) { if (quick_screen_f3(ACTION_F3)) reload_dir = true; restore = true; } break; #endif #ifdef HAVE_HOTKEY case ACTION_TREE_HOTKEY: if (!global_settings.hotkey_tree) break; /* fall through */ #endif case ACTION_STD_CONTEXT: { bool hotkey = button == ACTION_TREE_HOTKEY; int onplay_result; int attr = 0; if (tc.browse->flags & BROWSE_NO_CONTEXT_MENU) break; if(!numentries) onplay_result = onplay(NULL, 0, curr_context, hotkey); else { #ifdef HAVE_TAGCACHE if (id3db) { if (tagtree_get_attr(&tc) == FILE_ATTR_AUDIO) { attr = FILE_ATTR_AUDIO; tagtree_get_filename(&tc, buf, sizeof(buf)); } else attr = ATTR_DIRECTORY; } else #endif { struct entry *entry = tree_get_entry_at(&tc, tc.selected_item); attr = entry->attr; if (currdir[1]) /* Not in / */ snprintf(buf, sizeof buf, "%s/%s", currdir, entry->name); else /* In / */ snprintf(buf, sizeof buf, "/%s", entry->name); } onplay_result = onplay(buf, attr, curr_context, hotkey); } switch (onplay_result) { case ONPLAY_MAINMENU: return GO_TO_ROOT; case ONPLAY_OK: restore = true; break; case ONPLAY_RELOAD_DIR: reload_dir = true; break; case ONPLAY_START_PLAY: return GO_TO_WPS; break; } break; } #ifdef HAVE_HOTSWAP case SYS_FS_CHANGED: #ifdef HAVE_TAGCACHE if (!id3db) #endif reload_dir = true; /* The 'dir no longer valid' situation will be caught later * by checking the showdir() result. */ break; #endif default: if (default_event_handler(button) == SYS_USB_CONNECTED) { if(*tc.dirfilter > NUM_FILTER_MODES) /* leave sub-browsers after usb, doing otherwise might be confusing to the user */ exit_func = true; else reload_dir = true; } break; } if (start_wps) return GO_TO_WPS; if (button && !IS_SYSEVENT(button)) { storage_spin(); } check_rescan: /* do we need to rescan dir? */ if (reload_dir || reload_root || lastfilter != *tc.dirfilter || lastsortcase != global_settings.sort_case) { if (reload_root) { strcpy(currdir, "/"); tc.dirlevel = 0; #ifdef HAVE_TAGCACHE tc.currtable = 0; tc.currextra = 0; lasttable = -1; lastextra = -1; #endif reload_root = false; } if (!reload_dir) { gui_synclist_select_item(&tree_lists, 0); gui_synclist_draw(&tree_lists); tc.selected_item = 0; lastdir[0] = 0; } lastfilter = *tc.dirfilter; lastsortcase = global_settings.sort_case; restore = true; } if (exit_func) return GO_TO_PREVIOUS; if (restore || reload_dir) { /* restore display */ numentries = update_dir(); reload_dir = false; if (currdir[1] && (numentries < 0)) { /* not in root and reload failed */ reload_root = true; /* try root */ goto check_rescan; } } } return true; }
/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { long button; (void)parameter; #ifdef HAVE_LCD_COLOR int cs = 0; bool quit = false; #endif /* HAVE_LCD_COLOR */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS short old_brightness = rb->global_settings->brightness; #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS short old_buttonlight_brightness = rb->global_settings->buttonlight_brightness; #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #if LCD_DEPTH > 1 unsigned bg_color=rb->lcd_get_background(); rb->lcd_set_backdrop(NULL); rb->lcd_set_background(LCD_WHITE); #endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS rb->backlight_set_brightness(MAX_BRIGHTNESS_SETTING); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS rb->buttonlight_set_brightness(MAX_BRIGHTNESS_SETTING); #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #ifdef HAVE_LCD_INVERT #ifdef HAVE_NEGATIVE_LCD rb->lcd_set_invert_display(true); #else rb->lcd_set_invert_display(false); #endif /* HAVE_NEGATIVE_LCD */ #endif /* HAVE_LCD_INVERT */ backlight_force_on(); #ifdef HAVE_BUTTON_LIGHT buttonlight_force_on(); #endif /* HAVE_BUTTON_LIGHT */ #ifdef HAVE_LCD_COLOR do { if(cs < 0) cs = NUM_COLORSETS-1; if(cs >= NUM_COLORSETS) cs = 0; rb->lcd_set_background( LCD_RGBPACK( colorset[cs][0], colorset[cs][1], colorset[cs][2] ) ); rb->lcd_clear_display(); rb->lcd_update(); switch((button = rb->button_get(true))) { case LAMP_RIGHT: #ifdef LAMP_NEXT case LAMP_NEXT: #endif /* LAMP_NEXT */ cs++; break; case LAMP_LEFT: #ifdef LAMP_PREV case LAMP_PREV: #endif /* LAMP_PREV */ cs--; break; case (LAMP_RIGHT|BUTTON_REPEAT): case (LAMP_RIGHT|BUTTON_REL): case (LAMP_LEFT|BUTTON_REPEAT): case (LAMP_LEFT|BUTTON_REL): #ifdef LAMP_NEXT case (LAMP_NEXT|BUTTON_REPEAT): case (LAMP_NEXT|BUTTON_REL): #endif /* LAMP_NEXT */ #ifdef LAMP_PREV case (LAMP_PREV|BUTTON_REPEAT): case (LAMP_PREV|BUTTON_REL): #endif /* LAMP_PREV */ /* eat these... */ break; default: quit = true; } } while (!quit); #else /* HAVE_LCD_COLOR */ rb->lcd_clear_display(); rb->lcd_update(); /* wait */ do { button = rb->button_get(false); if (button && !IS_SYSEVENT(button)) break; rb->yield(); } while (1); #endif /*HAVE_LCD_COLOR */ /* restore */ backlight_use_settings(); #ifdef HAVE_BUTTON_LIGHT buttonlight_use_settings(); #endif /* HAVE_BUTTON_LIGHT */ #ifdef HAVE_LCD_INVERT rb->lcd_set_invert_display(rb->global_settings->invert); #endif /* HAVE_LCD_INVERT */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS rb->backlight_set_brightness(old_brightness); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS rb->buttonlight_set_brightness(old_buttonlight_brightness); #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #if LCD_DEPTH > 1 rb->lcd_set_background(bg_color); #endif return PLUGIN_OK; }
/* this is the plugin entry point */ enum plugin_status plugin_start(const void* parameter) { enum plugin_status status = PLUGIN_OK; long button; bool quit = false; (void)parameter; #ifdef HAVE_LCD_COLOR int cs = 0; bool update = false; #endif /* HAVE_LCD_COLOR */ #if LCD_DEPTH > 1 unsigned bg_color = rb->lcd_get_background(); rb->lcd_set_backdrop(NULL); rb->lcd_set_background(LCD_WHITE); #endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS int current_brightness = MAX_BRIGHTNESS_SETTING; backlight_brightness_set(MAX_BRIGHTNESS_SETTING); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS buttonlight_brightness_set(MAX_BRIGHTNESS_SETTING); #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #ifdef HAVE_LCD_INVERT #ifdef HAVE_NEGATIVE_LCD rb->lcd_set_invert_display(true); #else rb->lcd_set_invert_display(false); #endif /* HAVE_NEGATIVE_LCD */ #endif /* HAVE_LCD_INVERT */ backlight_force_on(); #ifdef HAVE_BUTTON_LIGHT buttonlight_force_on(); #endif /* HAVE_BUTTON_LIGHT */ rb->lcd_clear_display(); rb->lcd_update(); do { #ifdef HAVE_LCD_COLOR if(update) { if(cs < 0) cs = NUM_COLORSETS-1; if(cs >= NUM_COLORSETS) cs = 0; rb->lcd_set_background(colorset[cs]); rb->lcd_clear_display(); rb->lcd_update(); update = false; } #endif /* HAVE_LCD_COLOR */ switch((button = rb->button_get_w_tmo(HZ*30))) { #ifdef HAVE_LCD_COLOR case LAMP_RIGHT: #ifdef LAMP_NEXT case LAMP_NEXT: #endif /* LAMP_NEXT */ cs++; update = true; break; case LAMP_LEFT: #ifdef LAMP_PREV case LAMP_PREV: #endif /* LAMP_PREV */ cs--; update = true; break; #endif /* HAVE_LCD_COLOR */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS case LAMP_UP: case (LAMP_UP|BUTTON_REPEAT): if (current_brightness < MAX_BRIGHTNESS_SETTING) backlight_brightness_set(++current_brightness); break; case LAMP_DOWN: case (LAMP_DOWN|BUTTON_REPEAT): if (current_brightness > MIN_BRIGHTNESS_SETTING) backlight_brightness_set(--current_brightness); break; #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ case BUTTON_NONE: /* time out */ break; default: if(rb->default_event_handler(button) == SYS_USB_CONNECTED) { status = PLUGIN_USB_CONNECTED; quit = true; } if(!(button & (BUTTON_REL|BUTTON_REPEAT)) && !IS_SYSEVENT(button)) quit = true; break; } rb->reset_poweroff_timer(); } while (!quit); /* restore */ backlight_use_settings(); #ifdef HAVE_BUTTON_LIGHT buttonlight_use_settings(); #endif /* HAVE_BUTTON_LIGHT */ #ifdef HAVE_LCD_INVERT rb->lcd_set_invert_display(rb->global_settings->invert); #endif /* HAVE_LCD_INVERT */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS backlight_brightness_use_setting(); #endif /* HAVE_BACKLIGHT_BRIGHTNESS */ #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS buttonlight_brightness_use_setting(); #endif /* HAVE_BUTTONLIGHT_BRIGHTNESS */ #if LCD_DEPTH > 1 rb->lcd_set_background(bg_color); #endif return status; }