From 3bbd3fe979b9ac3b5d423587f3067c7978b935b5 Mon Sep 17 00:00:00 2001 From: kugel Date: Sun, 5 Jul 2009 22:12:42 +0000 Subject: [PATCH] Add a possibility for plugins to go directly to the WPS after exiting. It only works for plugins executed via the filebrowser for now. Those executed from the context menu or a simplelist (such as "Open With...") need additional hacking. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21680 a1c6a512-1295-4272-9138-f99709370657 --- apps/filetree.c | 48 +++++++++++++++++++++++++++++++++++++----------- apps/plugin.c | 32 +++++++++++++------------------- apps/plugin.h | 1 + 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/apps/filetree.c b/apps/filetree.c index d4681ae2c..87ac37c2e 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -552,22 +552,35 @@ int ft_enter(struct tree_context* c) /* plugin file */ case FILE_ATTR_ROCK: + { + int ret; if (global_settings.party_mode && audio_status()) { splash(HZ, ID2P(LANG_PARTY_MODE)); break; } - - if (plugin_load(buf,NULL) == PLUGIN_USB_CONNECTED) + ret = plugin_load(buf,NULL); + switch (ret) { - if(*c->dirfilter > NUM_FILTER_MODES) - /* leave sub-browsers after usb, doing - otherwise might be confusing to the user */ - exit_func = true; - else - reload_dir = true; + case PLUGIN_GOTO_WPS: + play = true; + break; + case PLUGIN_USB_CONNECTED: + if(*c->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; + /* + case PLUGIN_ERROR: + case PLUGIN_OK: + */ + default: + break; } break; - + } case FILE_ATTR_CUE: display_cuesheet_content(buf); break; @@ -584,8 +597,21 @@ int ft_enter(struct tree_context* c) plugin = filetype_get_plugin(file); if (plugin) { - if (plugin_load(plugin,buf) == PLUGIN_USB_CONNECTED) - reload_dir = true; + switch (plugin_load(plugin,buf)) + { + case PLUGIN_USB_CONNECTED: + reload_dir = true; + break; + case PLUGIN_GOTO_WPS: + play = true; + break; + /* + case PLUGIN_OK: + case PLUGIN_ERROR: + */ + default: + break; + } } break; } diff --git a/apps/plugin.c b/apps/plugin.c index d6a5d067c..f08a98753 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -664,6 +664,7 @@ static const struct plugin_api rockbox_api = { int plugin_load(const char* plugin, const void* parameter) { int rc; + int i; int oldbars; struct plugin_header *hdr; #ifdef SIMULATOR @@ -804,8 +805,6 @@ int plugin_load(const char* plugin, const void* parameter) #endif /* LCD_DEPTH */ #endif /* HAVE_LCD_BITMAP */ - lcd_clear_display(); - lcd_update(); #ifdef HAVE_REMOTE_LCD #if LCD_REMOTE_DEPTH > 1 @@ -814,32 +813,27 @@ int plugin_load(const char* plugin, const void* parameter) #else lcd_remote_set_drawmode(DRMODE_SOLID); #endif - lcd_remote_clear_display(); - - - lcd_remote_update(); +#endif + if (rc != PLUGIN_GOTO_WPS) + { + FOR_NB_SCREENS(i) + { + screens[i].clear_display(); + screens[i].update(); + } + } -#endif viewportmanager_set_statusbar(oldbars); if (pfn_tsr_exit == NULL) plugin_loaded = false; sim_plugin_close(pd); - switch (rc) { - case PLUGIN_OK: - break; - - case PLUGIN_USB_CONNECTED: - return PLUGIN_USB_CONNECTED; - - default: - splash(HZ*2, str(LANG_PLUGIN_ERROR)); - break; - } + if (rc == PLUGIN_ERROR) + splash(HZ*2, str(LANG_PLUGIN_ERROR)); - return PLUGIN_OK; + return rc; } /* Returns a pointer to the portion of the plugin buffer that is not already diff --git a/apps/plugin.h b/apps/plugin.h index f3d4c23e8..253cfd0aa 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -139,6 +139,7 @@ void* plugin_get_buffer(size_t *buffer_size); enum plugin_status { PLUGIN_OK = 0, PLUGIN_USB_CONNECTED, + PLUGIN_GOTO_WPS, PLUGIN_ERROR = -1, }; -- 2.11.4.GIT