X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fscreen_file.c;h=1f39395c9d839e1c96d896609ccf054e6f3d25ac;hb=61b081d64d4135698b56f63c931da60c64511e3c;hp=bef155f5948e10669e9c728c56b54bc2c2efa979;hpb=ef040e296e46fcc7620edaf89ffac05e065ec3e3;p=ncmpc.git diff --git a/src/screen_file.c b/src/screen_file.c index bef155f..1f39395 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -26,13 +26,11 @@ #include "screen_utils.h" #include "screen_browser.h" #include "screen_play.h" -#include "gcc.h" #include #include #include #include -#include static struct screen_browser browser; @@ -55,16 +53,19 @@ file_repaint_if_active(void) /* the db have changed -> update the filelist */ static void -file_changed_callback(mpdclient_t *c, mpd_unused int event, - mpd_unused gpointer data) +file_changed_callback(mpdclient_t *c, G_GNUC_UNUSED int event, + G_GNUC_UNUSED gpointer data) { browser.filelist = mpdclient_filelist_update(c, browser.filelist); +#ifndef NCMPC_MINI sync_highlights(c, browser.filelist); +#endif list_window_check_selected(browser.lw, filelist_length(browser.filelist)); file_repaint_if_active(); } +#ifndef NCMPC_MINI /* the playlist have been updated -> fix highlights */ static void playlist_changed_callback(mpdclient_t *c, int event, gpointer data) @@ -73,12 +74,14 @@ playlist_changed_callback(mpdclient_t *c, int event, gpointer data) file_repaint_if_active(); } +#endif static int handle_save(mpdclient_t *c) { filelist_entry_t *entry; char *defaultname = NULL; + int ret; if (browser.lw->selected >= filelist_length(browser.filelist)) return -1; @@ -92,7 +95,11 @@ handle_save(mpdclient_t *c) } } - return playlist_save(c, NULL, defaultname); + defaultname = utf8_to_locale(defaultname); + ret = playlist_save(c, NULL, defaultname); + g_free(defaultname); + + return ret; } static int @@ -114,7 +121,7 @@ handle_delete(mpdclient_t *c) entity = entry->entity; if( entity->type!=MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { - screen_status_printf(_("You can only delete playlists!")); + screen_status_printf(_("You can only delete playlists")); screen_bell(); return -1; } @@ -126,14 +133,14 @@ handle_delete(mpdclient_t *c) key = tolower(screen_getch(screen.status_window.w, buf)); g_free(buf); if( key != YES[0] ) { - screen_status_printf(_("Aborted!")); + screen_status_printf(_("Aborted")); return 0; } - if( mpdclient_cmd_delete_playlist_utf8(c, plf->path) ) + if( mpdclient_cmd_delete_playlist(c, plf->path) ) return -1; - screen_status_printf(_("Playlist deleted!")); + screen_status_printf(_("Playlist deleted")); return 0; } @@ -159,11 +166,13 @@ browse_exit(void) } static void -browse_open(mpd_unused mpdclient_t *c) +browse_open(G_GNUC_UNUSED mpdclient_t *c) { if (browser.filelist == NULL) { browser.filelist = mpdclient_filelist_get(c, ""); +#ifndef NCMPC_MINI mpdclient_install_playlist_callback(c, playlist_changed_callback); +#endif mpdclient_install_browse_callback(c, file_changed_callback); } } @@ -171,21 +180,22 @@ browse_open(mpd_unused mpdclient_t *c) static const char * browse_title(char *str, size_t size) { - char *dirname, *parentdir; - - dirname = g_path_get_dirname(browser.filelist->path); - parentdir = g_path_get_basename(dirname); + const char *path = NULL, *prev = NULL, *slash = browser.filelist->path; + char *path_locale; - if( parentdir[0] == '.' && strlen(parentdir) == 1 ) { - parentdir = NULL; + /* determine the last 2 parts of the path */ + while ((slash = strchr(slash, '/')) != NULL) { + path = prev; + prev = ++slash; } - g_snprintf(str, size, _("Browse: %s%s%s"), - parentdir ? parentdir : "", - parentdir ? "/" : "", - g_basename(browser.filelist->path)); - free(dirname); - free(parentdir); + if (path == NULL) + /* fall back to full path */ + path = browser.filelist->path; + + path_locale = utf8_to_locale(path); + g_snprintf(str, size, _("Browse: %s"), path_locale); + g_free(path_locale); return str; } @@ -195,18 +205,24 @@ browse_paint(void) list_window_paint(browser.lw, browser_lw_callback, browser.filelist); } -static int +static bool browse_cmd(mpdclient_t *c, command_t cmd) { switch(cmd) { case CMD_GO_ROOT_DIRECTORY: browser_change_directory(&browser, c, NULL, ""); file_repaint(); - return 1; + return true; case CMD_GO_PARENT_DIRECTORY: browser_change_directory(&browser, c, NULL, ".."); file_repaint(); - return 1; + return true; + + case CMD_LOCATE: + /* don't let browser_cmd() evaluate the locate command + - it's a no-op, and by the way, leads to a + segmentation fault in the current implementation */ + return false; case CMD_DELETE: handle_delete(c); @@ -217,25 +233,28 @@ browse_cmd(mpdclient_t *c, command_t cmd) break; case CMD_SCREEN_UPDATE: browser.filelist = mpdclient_filelist_update(c, browser.filelist); +#ifndef NCMPC_MINI sync_highlights(c, browser.filelist); +#endif list_window_check_selected(browser.lw, filelist_length(browser.filelist)); file_repaint(); - - screen_status_printf(_("Screen updated!")); - return 0; + return false; case CMD_DB_UPDATE: if (c->status == NULL) - return 1; + return true; if (!c->status->updatingDb) { - if (mpdclient_cmd_db_update_utf8(c, browser.filelist->path) == 0) { - if (strcmp(browser.filelist->path, "")) - screen_status_printf(_("Database update of %s started!"), - browser.filelist->path); - else - screen_status_printf(_("Database update started!")); + if (mpdclient_cmd_db_update(c, browser.filelist->path) == 0) { + if (strcmp(browser.filelist->path, "")) { + char *path_locale = + utf8_to_locale(browser.filelist->path); + screen_status_printf(_("Database update of %s started"), + path_locale); + g_free(path_locale); + } else + screen_status_printf(_("Database update started")); /* set updatingDb to make shure the browse callback gets called * even if the updated has finished before status is updated */ @@ -243,18 +262,19 @@ browse_cmd(mpdclient_t *c, command_t cmd) } } else screen_status_printf(_("Database update running...")); - return 1; + return true; default: break; } if (browser_cmd(&browser, c, cmd)) { - file_repaint(); - return 1; + if (screen_is_visible(&screen_browse)) + file_repaint(); + return true; } - return 0; + return false; } const struct screen_functions screen_browse = { @@ -266,3 +286,44 @@ const struct screen_functions screen_browse = { .cmd = browse_cmd, .get_title = browse_title, }; + +bool +screen_file_goto_song(struct mpdclient *c, const struct mpd_song *song) +{ + const char *slash, *parent; + char *allocated = NULL; + bool ret; + int i; + + assert(song != NULL); + assert(song->file != NULL); + + if (strstr(song->file, "//") != NULL) + /* an URL? */ + return false; + + /* determine the song's parent directory and go there */ + + slash = strrchr(song->file, '/'); + if (slash != NULL) + parent = allocated = g_strndup(song->file, slash - song->file); + else + parent = ""; + + ret = browser_change_directory(&browser, c, NULL, parent); + g_free(allocated); + if (!ret) + return false; + + /* select the specified song */ + + i = filelist_find_song(browser.filelist, song); + if (i < 0) + i = 0; + + list_window_set_selected(browser.lw, i); + + /* finally, switch to the file screen */ + screen_switch(&screen_browse, c); + return true; +}