From cde030e211b3d9ea517403b5d5547b6d374fc470 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 18 Sep 2008 23:35:11 +0200 Subject: [PATCH] screen_browser: moved code to screen_browser.c Isolate the generic browser code from the directory browser. --- src/Makefile.am | 1 + src/screen_artist.c | 15 +- src/screen_browser.c | 474 ++++++++++++++++++++++++++++++++++++++++++ src/screen_browser.h | 66 ++++-- src/screen_file.c | 476 +------------------------------------------ src/screen_search.c | 17 +- 6 files changed, 542 insertions(+), 507 deletions(-) create mode 100644 src/screen_browser.c diff --git a/src/Makefile.am b/src/Makefile.am index f156c44..55f42eb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,6 +52,7 @@ ncmpc_SOURCES = \ screen.c\ screen_utils.c\ screen_play.c\ + screen_browser.c\ screen_file.c\ screen_artist.c\ screen_search.c\ diff --git a/src/screen_artist.c b/src/screen_artist.c index 8e9732b..a839003 100644 --- a/src/screen_artist.c +++ b/src/screen_artist.c @@ -234,7 +234,7 @@ paint(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) browser.lw->clear = 1; if (browser.filelist) { - list_window_paint(browser.lw, browse_lw_callback, + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); browser.filelist->updated = FALSE; } else if (metalist) { @@ -251,7 +251,7 @@ static void update(screen_t *screen, mpdclient_t *c) { if (browser.filelist && !browser.filelist->updated) - list_window_paint(browser.lw, browse_lw_callback, + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); else if (metalist) list_window_paint(browser.lw, artist_lw_callback, metalist); @@ -348,8 +348,7 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) list_window_pop_state(browser.lw_state, browser.lw); } else - browse_handle_enter(screen, c, browser.lw, - browser.filelist); + browser_handle_enter(&browser, c); break; } return 1; @@ -415,8 +414,7 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) break; case LIST_SONGS: - if (browse_handle_select(screen, c, browser.lw, - browser.filelist) == 0) + if (browser_handle_select(&browser, c) == 0) /* continue and select next item... */ cmd = CMD_LIST_NEXT; break; @@ -439,7 +437,7 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) if (browser.filelist) return screen_find(screen, browser.lw, browser.filelist->length, - cmd, browse_lw_callback, + cmd, browser_lw_callback, browser.filelist); else if (metalist) return screen_find(screen, @@ -449,8 +447,7 @@ artist_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) return 1; case CMD_MOUSE_EVENT: - return browse_handle_mouse_event(screen, c,browser.lw, - browser.filelist); + return browser_handle_mouse_event(&browser, c); default: break; diff --git a/src/screen_browser.c b/src/screen_browser.c new file mode 100644 index 0000000..737b138 --- /dev/null +++ b/src/screen_browser.c @@ -0,0 +1,474 @@ +/* + * $Id$ + * + * (c) 2004 by Kalle Wallin + * Copyright (C) 2008 Max Kellermann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "screen_browser.h" +#include "ncmpc.h" +#include "options.h" +#include "support.h" +#include "strfsong.h" +#include "screen_utils.h" +#include "gcc.h" + +#include + +#define USE_OLD_LAYOUT +#undef USE_OLD_ADD + +#define BUFSIZE 1024 + +#define HIGHLIGHT (0x01) + +/* clear the highlight flag for all items in the filelist */ +void +clear_highlights(mpdclient_filelist_t *fl) +{ + GList *list = g_list_first(fl->list); + + while( list ) { + filelist_entry_t *entry = list->data; + + entry->flags &= ~HIGHLIGHT; + list = list->next; + } +} + +/* change the highlight flag for a song */ +void +set_highlight(mpdclient_filelist_t *fl, mpd_Song *song, int highlight) +{ + GList *list = g_list_first(fl->list); + + if( !song ) + return; + + while( list ) { + filelist_entry_t *entry = list->data; + mpd_InfoEntity *entity = entry->entity; + + if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { + mpd_Song *song2 = entity->info.song; + + if( strcmp(song->file, song2->file) == 0 ) { + if(highlight) + entry->flags |= HIGHLIGHT; + else + entry->flags &= ~HIGHLIGHT; + } + } + list = list->next; + } +} + +/* sync highlight flags with playlist */ +void +sync_highlights(mpdclient_t *c, mpdclient_filelist_t *fl) +{ + GList *list = g_list_first(fl->list); + + while(list) { + filelist_entry_t *entry = list->data; + mpd_InfoEntity *entity = entry->entity; + + if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { + mpd_Song *song = entity->info.song; + + if( playlist_get_index_from_file(c, song->file) >= 0 ) + entry->flags |= HIGHLIGHT; + else + entry->flags &= ~HIGHLIGHT; + } + list=list->next; + } +} + +/* list_window callback */ +const char * +browser_lw_callback(unsigned idx, int *highlight, void *data) +{ + static char buf[BUFSIZE]; + mpdclient_filelist_t *fl = (mpdclient_filelist_t *) data; + filelist_entry_t *entry; + mpd_InfoEntity *entity; + + if( (entry=(filelist_entry_t *)g_list_nth_data(fl->list,idx))==NULL ) + return NULL; + + entity = entry->entity; + *highlight = (entry->flags & HIGHLIGHT); + + if( entity == NULL ) + return "[..]"; + + if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { + mpd_Directory *dir = entity->info.directory; + char *directory = utf8_to_locale(basename(dir->path)); + + g_snprintf(buf, BUFSIZE, "[%s]", directory); + g_free(directory); + return buf; + } else if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { + mpd_Song *song = entity->info.song; + + strfsong(buf, BUFSIZE, LIST_FORMAT, song); + return buf; + } else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { + mpd_PlaylistFile *plf = entity->info.playlistFile; + char *filename = utf8_to_locale(basename(plf->path)); + +#ifdef USE_OLD_LAYOUT + g_snprintf(buf, BUFSIZE, "*%s*", filename); +#else + g_snprintf(buf, BUFSIZE, " %s", filename); +#endif + g_free(filename); + return buf; + } + + return "Error: Unknown entry!"; +} + +/* chdir */ +int +browser_change_directory(struct screen_browser *browser, mpdclient_t *c, + filelist_entry_t *entry, const char *new_path) +{ + mpd_InfoEntity *entity = NULL; + gchar *path = NULL; + + if( entry!=NULL ) + entity = entry->entity; + else if( new_path==NULL ) + return -1; + + if( entity==NULL ) { + if( entry || 0==strcmp(new_path, "..") ) { + /* return to parent */ + char *parent = g_path_get_dirname(browser->filelist->path); + if( strcmp(parent, ".") == 0 ) + parent[0] = '\0'; + path = g_strdup(parent); + list_window_reset(browser->lw); + /* restore previous list window state */ + list_window_pop_state(browser->lw_state, browser->lw); + } else { + /* entry==NULL, then new_path ("" is root) */ + path = g_strdup(new_path); + list_window_reset(browser->lw); + /* restore first list window state (pop while returning true) */ + while(list_window_pop_state(browser->lw_state, browser->lw)); + } + } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY) { + /* enter sub */ + mpd_Directory *dir = entity->info.directory; + path = utf8_to_locale(dir->path); + /* save current list window state */ + list_window_push_state(browser->lw_state, browser->lw); + } else + return -1; + + mpdclient_filelist_free(browser->filelist); + browser->filelist = mpdclient_filelist_get(c, path); + sync_highlights(c, browser->filelist); + list_window_check_selected(browser->lw, browser->filelist->length); + g_free(path); + return 0; +} + +static int +load_playlist(mpdclient_t *c, filelist_entry_t *entry) +{ + mpd_InfoEntity *entity = entry->entity; + mpd_PlaylistFile *plf = entity->info.playlistFile; + char *filename = utf8_to_locale(plf->path); + + if (mpdclient_cmd_load_playlist_utf8(c, plf->path) == 0) + screen_status_printf(_("Loading playlist %s..."), basename(filename)); + g_free(filename); + return 0; +} + +static int +enqueue_and_play(mpdclient_t *c, filelist_entry_t *entry) +{ + int idx; + mpd_InfoEntity *entity = entry->entity; + mpd_Song *song = entity->info.song; + + if (!(entry->flags & HIGHLIGHT)) { + if (mpdclient_cmd_add(c, song) == 0) { + char buf[BUFSIZE]; + + entry->flags |= HIGHLIGHT; + strfsong(buf, BUFSIZE, LIST_FORMAT, song); + screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); + mpdclient_update(c); /* get song id */ + } else + return -1; + } + + idx = playlist_get_index_from_file(c, song->file); + mpdclient_cmd_play(c, idx); + return 0; +} + +int +browser_handle_enter(struct screen_browser *browser, mpdclient_t *c) +{ + filelist_entry_t *entry; + mpd_InfoEntity *entity; + + if (browser->filelist == NULL) + return -1; + entry = (filelist_entry_t *) g_list_nth_data(browser->filelist->list, + browser->lw->selected); + if( entry==NULL ) + return -1; + + entity = entry->entity; + if (entity == NULL || entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) + return browser_change_directory(browser, c, entry, NULL); + else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) + return load_playlist(c, entry); + else if (entity->type == MPD_INFO_ENTITY_TYPE_SONG) + return enqueue_and_play(c, entry); + return -1; +} + + +#ifdef USE_OLD_ADD +/* NOTE - The add_directory functions should move to mpdclient.c */ +extern gint mpdclient_finish_command(mpdclient_t *c); + +static int +add_directory(mpdclient_t *c, char *dir) +{ + mpd_InfoEntity *entity; + GList *subdir_list = NULL; + GList *list = NULL; + char *dirname; + + dirname = utf8_to_locale(dir); + screen_status_printf(_("Adding directory %s...\n"), dirname); + doupdate(); + g_free(dirname); + dirname = NULL; + + mpd_sendLsInfoCommand(c->connection, dir); + mpd_sendCommandListBegin(c->connection); + while( (entity=mpd_getNextInfoEntity(c->connection)) ) { + if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { + mpd_Song *song = entity->info.song; + mpd_sendAddCommand(c->connection, song->file); + mpd_freeInfoEntity(entity); + } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { + subdir_list = g_list_append(subdir_list, (gpointer) entity); + } else + mpd_freeInfoEntity(entity); + } + mpd_sendCommandListEnd(c->connection); + mpdclient_finish_command(c); + c->need_update = TRUE; + + list = g_list_first(subdir_list); + while( list!=NULL ) { + mpd_Directory *dir; + + entity = list->data; + dir = entity->info.directory; + add_directory(c, dir->path); + mpd_freeInfoEntity(entity); + list->data=NULL; + list=list->next; + } + g_list_free(subdir_list); + return 0; +} +#endif + +int +browser_handle_select(struct screen_browser *browser, mpdclient_t *c) +{ + filelist_entry_t *entry; + + if (browser->filelist == NULL) + return -1; + entry = g_list_nth_data(browser->filelist->list, browser->lw->selected); + if (entry == NULL || entry->entity == NULL) + return -1; + + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) + return load_playlist(c, entry); + + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { + mpd_Directory *dir = entry->entity->info.directory; +#ifdef USE_OLD_ADD + add_directory(c, tmp); +#else + if (mpdclient_cmd_add_path_utf8(c, dir->path) == 0) { + char *tmp = utf8_to_locale(dir->path); + + screen_status_printf(_("Adding \'%s\' to playlist\n"), tmp); + g_free(tmp); + } +#endif + return 0; + } + + if (entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + return -1; + + if (entry->flags & HIGHLIGHT) + entry->flags &= ~HIGHLIGHT; + else + entry->flags |= HIGHLIGHT; + + if (entry->flags & HIGHLIGHT) { + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_SONG) { + mpd_Song *song = entry->entity->info.song; + + if (mpdclient_cmd_add(c, song) == 0) { + char buf[BUFSIZE]; + + strfsong(buf, BUFSIZE, LIST_FORMAT, song); + screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); + } + } + } else { + /* remove song from playlist */ + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_SONG) { + mpd_Song *song = entry->entity->info.song; + + if (song) { + int idx; + + while ((idx = playlist_get_index_from_file(c, song->file)) >=0) + mpdclient_cmd_delete(c, idx); + } + } + } + + return 0; +} + +int +browser_handle_select_all(struct screen_browser *browser, mpdclient_t *c) +{ + filelist_entry_t *entry; + GList *temp = browser->filelist->list; + + if (browser->filelist == NULL) + return -1; + + for (browser->filelist->list = g_list_first(browser->filelist->list); + browser->filelist->list; + browser->filelist->list = g_list_next(browser->filelist->list)) { + entry = browser->filelist->list->data; + if (entry == NULL || entry->entity == NULL) + return -1; + + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) + load_playlist(c, entry); + + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { + mpd_Directory *dir = entry->entity->info.directory; +#ifdef USE_OLD_ADD + add_directory(c, tmp); +#else + if (mpdclient_cmd_add_path_utf8(c, dir->path) == 0) { + char *tmp = utf8_to_locale(dir->path); + + screen_status_printf(_("Adding \'%s\' to playlist\n"), tmp); + g_free(tmp); + } +#endif + } + + if (entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + continue; + + entry->flags |= HIGHLIGHT; + + if (entry->flags & HIGHLIGHT) { + if (entry->entity->type == MPD_INFO_ENTITY_TYPE_SONG) { + mpd_Song *song = entry->entity->info.song; + + if (mpdclient_cmd_add(c, song) == 0) { + char buf[BUFSIZE]; + + strfsong(buf, BUFSIZE, LIST_FORMAT, song); + screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); + } + } + } + /* + else { + //remove song from playlist + if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { + mpd_Song *song = entry->entity->info.song; + + if( song ) { + int idx = playlist_get_index_from_file(c, song->file); + + while( (idx=playlist_get_index_from_file(c, song->file))>=0 ) + mpdclient_cmd_delete(c, idx); + } + } + } + */ + return 0; + } + + browser->filelist->list = temp; + return 0; +} + +#ifdef HAVE_GETMOUSE +int +browser_handle_mouse_event(struct screen_browser *browser, mpdclient_t *c) +{ + int row; + unsigned prev_selected = browser->lw->selected; + unsigned long bstate; + int length; + + if (browser->filelist) + length = browser->filelist->length; + else + length = 0; + + if( screen_get_mouse_event(c, browser->lw, length, &bstate, &row) ) + return 1; + + browser->lw->selected = browser->lw->start + row; + list_window_check_selected(browser->lw, length); + + if( bstate & BUTTON1_CLICKED ) { + if (prev_selected == browser->lw->selected) + browser_handle_enter(browser, c); + } else if (bstate & BUTTON3_CLICKED) { + if (prev_selected == browser->lw->selected) + browser_handle_select(browser, c); + } + + return 1; +} +#endif + diff --git a/src/screen_browser.h b/src/screen_browser.h index 3ebcff2..fbe131c 100644 --- a/src/screen_browser.h +++ b/src/screen_browser.h @@ -1,3 +1,34 @@ +/* + * $Id$ + * + * (c) 2004 by Kalle Wallin + * Copyright (C) 2008 Max Kellermann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef SCREEN_BROWSER_H +#define SCREEN_BROWSER_H + +#include "screen.h" +#include "mpdclient.h" +#include "config.h" + +struct list_window; +struct list_window_state; + struct screen_browser { struct list_window *lw; struct list_window_state *lw_state; @@ -12,29 +43,24 @@ void set_highlight(mpdclient_filelist_t *filelist, int highlight); -const char *browse_lw_callback(unsigned index, int *highlight, void *filelist); +const char *browser_lw_callback(unsigned index, int *highlight, void *filelist); + +int +browser_handle_select(struct screen_browser *browser, mpdclient_t *c); -int browse_handle_select(screen_t *screen, - mpdclient_t *c, - list_window_t *lw, - mpdclient_filelist_t *filelist); -int browse_handle_select_all (screen_t *screen, - mpdclient_t *c, - list_window_t *lw, - mpdclient_filelist_t *filelist); -int browse_handle_enter(screen_t *screen, - mpdclient_t *c, - list_window_t *lw, - mpdclient_filelist_t *filelist); +int browser_handle_select_all(struct screen_browser *browser, mpdclient_t *c); + +int +browser_change_directory(struct screen_browser *browser, mpdclient_t *c, + filelist_entry_t *entry, const char *new_path); + +int +browser_handle_enter(struct screen_browser *browser, mpdclient_t *c); #ifdef HAVE_GETMOUSE -int browse_handle_mouse_event(screen_t *screen, - mpdclient_t *c, - list_window_t *lw, - mpdclient_filelist_t *filelist); +int browser_handle_mouse_event(struct screen_browser *browser, mpdclient_t *c); #else -#define browse_handle_mouse_event(s,c,lw,filelist) (0) +#define browser_handle_mouse_event(browser, c) (0) #endif - - +#endif diff --git a/src/screen_file.c b/src/screen_file.c index 36e04b5..801c61f 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -23,7 +23,6 @@ #include "options.h" #include "support.h" #include "mpdclient.h" -#include "strfsong.h" #include "command.h" #include "screen.h" #include "screen_utils.h" @@ -37,78 +36,8 @@ #include #include -#define USE_OLD_LAYOUT -#undef USE_OLD_ADD - -#define BUFSIZE 1024 - -#define HIGHLIGHT (0x01) - static struct screen_browser browser; -/* clear the highlight flag for all items in the filelist */ -void -clear_highlights(mpdclient_filelist_t *fl) -{ - GList *list = g_list_first(fl->list); - - while( list ) { - filelist_entry_t *entry = list->data; - - entry->flags &= ~HIGHLIGHT; - list = list->next; - } -} - -/* change the highlight flag for a song */ -void -set_highlight(mpdclient_filelist_t *fl, mpd_Song *song, int highlight) -{ - GList *list = g_list_first(fl->list); - - if( !song ) - return; - - while( list ) { - filelist_entry_t *entry = list->data; - mpd_InfoEntity *entity = entry->entity; - - if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song2 = entity->info.song; - - if( strcmp(song->file, song2->file) == 0 ) { - if(highlight) - entry->flags |= HIGHLIGHT; - else - entry->flags &= ~HIGHLIGHT; - } - } - list = list->next; - } -} - -/* sync highlight flags with playlist */ -void -sync_highlights(mpdclient_t *c, mpdclient_filelist_t *fl) -{ - GList *list = g_list_first(fl->list); - - while(list) { - filelist_entry_t *entry = list->data; - mpd_InfoEntity *entity = entry->entity; - - if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entity->info.song; - - if( playlist_get_index_from_file(c, song->file) >= 0 ) - entry->flags |= HIGHLIGHT; - else - entry->flags &= ~HIGHLIGHT; - } - list=list->next; - } -} - /* the db have changed -> update the filelist */ static void file_changed_callback(mpdclient_t *c, mpd_unused int event, @@ -143,113 +72,6 @@ playlist_changed_callback(mpdclient_t *c, int event, gpointer data) } } -/* list_window callback */ -const char * -browse_lw_callback(unsigned idx, int *highlight, void *data) -{ - static char buf[BUFSIZE]; - mpdclient_filelist_t *fl = (mpdclient_filelist_t *) data; - filelist_entry_t *entry; - mpd_InfoEntity *entity; - - if( (entry=(filelist_entry_t *)g_list_nth_data(fl->list,idx))==NULL ) - return NULL; - - entity = entry->entity; - *highlight = (entry->flags & HIGHLIGHT); - - if( entity == NULL ) - return "[..]"; - - if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { - mpd_Directory *dir = entity->info.directory; - char *directory = utf8_to_locale(basename(dir->path)); - - g_snprintf(buf, BUFSIZE, "[%s]", directory); - g_free(directory); - return buf; - } else if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entity->info.song; - - strfsong(buf, BUFSIZE, LIST_FORMAT, song); - return buf; - } else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { - mpd_PlaylistFile *plf = entity->info.playlistFile; - char *filename = utf8_to_locale(basename(plf->path)); - -#ifdef USE_OLD_LAYOUT - g_snprintf(buf, BUFSIZE, "*%s*", filename); -#else - g_snprintf(buf, BUFSIZE, " %s", filename); -#endif - g_free(filename); - return buf; - } - - return "Error: Unknown entry!"; -} - -/* chdir */ -static int -change_directory(mpd_unused screen_t *screen, mpdclient_t *c, - filelist_entry_t *entry, const char *new_path) -{ - mpd_InfoEntity *entity = NULL; - gchar *path = NULL; - - if( entry!=NULL ) - entity = entry->entity; - else if( new_path==NULL ) - return -1; - - if( entity==NULL ) { - if( entry || 0==strcmp(new_path, "..") ) { - /* return to parent */ - char *parent = g_path_get_dirname(browser.filelist->path); - if( strcmp(parent, ".") == 0 ) - parent[0] = '\0'; - path = g_strdup(parent); - list_window_reset(browser.lw); - /* restore previous list window state */ - list_window_pop_state(browser.lw_state,browser.lw); - } else { - /* entry==NULL, then new_path ("" is root) */ - path = g_strdup(new_path); - list_window_reset(browser.lw); - /* restore first list window state (pop while returning true) */ - while(list_window_pop_state(browser.lw_state,browser.lw)); - } - } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY) { - /* enter sub */ - mpd_Directory *dir = entity->info.directory; - path = utf8_to_locale(dir->path); - /* save current list window state */ - list_window_push_state(browser.lw_state,browser.lw); - } else - return -1; - - mpdclient_filelist_free(browser.filelist); - browser.filelist = mpdclient_filelist_get(c, path); - sync_highlights(c, browser.filelist); - list_window_check_selected(browser.lw, browser.filelist->length); - g_free(path); - return 0; -} - -static int -load_playlist(mpd_unused screen_t *screen, mpdclient_t *c, - filelist_entry_t *entry) -{ - mpd_InfoEntity *entity = entry->entity; - mpd_PlaylistFile *plf = entity->info.playlistFile; - char *filename = utf8_to_locale(plf->path); - - if( mpdclient_cmd_load_playlist_utf8(c, plf->path) == 0 ) - screen_status_printf(_("Loading playlist %s..."), basename(filename)); - g_free(filename); - return 0; -} - static int handle_save(screen_t *screen, mpdclient_t *c) { @@ -309,249 +131,6 @@ handle_delete(screen_t *screen, mpdclient_t *c) return 0; } -static int -enqueue_and_play(mpd_unused screen_t *screen, mpdclient_t *c, - filelist_entry_t *entry) -{ - int idx; - mpd_InfoEntity *entity = entry->entity; - mpd_Song *song = entity->info.song; - - if(!( entry->flags & HIGHLIGHT )) { - if( mpdclient_cmd_add(c, song) == 0 ) { - char buf[BUFSIZE]; - - entry->flags |= HIGHLIGHT; - strfsong(buf, BUFSIZE, LIST_FORMAT, song); - screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); - mpdclient_update(c); /* get song id */ - } else - return -1; - } - - idx = playlist_get_index_from_file(c, song->file); - mpdclient_cmd_play(c, idx); - return 0; -} - -int -browse_handle_enter(screen_t *screen, - mpdclient_t *c, - list_window_t *local_lw, - mpdclient_filelist_t *fl) -{ - filelist_entry_t *entry; - mpd_InfoEntity *entity; - - if ( fl==NULL ) - return -1; - entry = ( filelist_entry_t *) g_list_nth_data(fl->list, local_lw->selected); - if( entry==NULL ) - return -1; - - entity = entry->entity; - if( entity==NULL || entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) - return change_directory(screen, c, entry, NULL); - else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) - return load_playlist(screen, c, entry); - else if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) - return enqueue_and_play(screen, c, entry); - return -1; -} - - -#ifdef USE_OLD_ADD -/* NOTE - The add_directory functions should move to mpdclient.c */ -extern gint mpdclient_finish_command(mpdclient_t *c); - -static int -add_directory(mpdclient_t *c, char *dir) -{ - mpd_InfoEntity *entity; - GList *subdir_list = NULL; - GList *list = NULL; - char *dirname; - - dirname = utf8_to_locale(dir); - screen_status_printf(_("Adding directory %s...\n"), dirname); - doupdate(); - g_free(dirname); - dirname = NULL; - - mpd_sendLsInfoCommand(c->connection, dir); - mpd_sendCommandListBegin(c->connection); - while( (entity=mpd_getNextInfoEntity(c->connection)) ) { - if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entity->info.song; - mpd_sendAddCommand(c->connection, song->file); - mpd_freeInfoEntity(entity); - } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { - subdir_list = g_list_append(subdir_list, (gpointer) entity); - } else - mpd_freeInfoEntity(entity); - } - mpd_sendCommandListEnd(c->connection); - mpdclient_finish_command(c); - c->need_update = TRUE; - - list = g_list_first(subdir_list); - while( list!=NULL ) { - mpd_Directory *dir; - - entity = list->data; - dir = entity->info.directory; - add_directory(c, dir->path); - mpd_freeInfoEntity(entity); - list->data=NULL; - list=list->next; - } - g_list_free(subdir_list); - return 0; -} -#endif - -int -browse_handle_select(screen_t *screen, - mpdclient_t *c, - list_window_t *local_lw, - mpdclient_filelist_t *fl) -{ - filelist_entry_t *entry; - - if ( fl==NULL ) - return -1; - entry=( filelist_entry_t *) g_list_nth_data(fl->list, - local_lw->selected); - if( entry==NULL || entry->entity==NULL) - return -1; - - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) - return load_playlist(screen, c, entry); - - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { - mpd_Directory *dir = entry->entity->info.directory; -#ifdef USE_OLD_ADD - add_directory(c, tmp); -#else - if( mpdclient_cmd_add_path_utf8(c, dir->path) == 0 ) { - char *tmp = utf8_to_locale(dir->path); - - screen_status_printf(_("Adding \'%s\' to playlist\n"), tmp); - g_free(tmp); - } -#endif - return 0; - } - - if( entry->entity->type!=MPD_INFO_ENTITY_TYPE_SONG ) - return -1; - - if( entry->flags & HIGHLIGHT ) - entry->flags &= ~HIGHLIGHT; - else - entry->flags |= HIGHLIGHT; - - if( entry->flags & HIGHLIGHT ) { - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entry->entity->info.song; - - if( mpdclient_cmd_add(c, song) == 0 ) { - char buf[BUFSIZE]; - - strfsong(buf, BUFSIZE, LIST_FORMAT, song); - screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); - } - } - } else { - /* remove song from playlist */ - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entry->entity->info.song; - - if( song ) { - int idx; - - while( (idx=playlist_get_index_from_file(c, song->file))>=0 ) - mpdclient_cmd_delete(c, idx); - } - } - } - return 0; -} - -int -browse_handle_select_all (screen_t *screen, - mpdclient_t *c, - mpd_unused list_window_t *local_lw, - mpdclient_filelist_t *fl) -{ - filelist_entry_t *entry; - GList *temp = fl->list; - - if ( fl==NULL ) - return -1; - for (fl->list = g_list_first(fl->list); - fl->list; - fl->list = g_list_next(fl->list)) { - entry=( filelist_entry_t *) fl->list->data; - if( entry==NULL || entry->entity==NULL) - return -1; - - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) - load_playlist(screen, c, entry); - - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { - mpd_Directory *dir = entry->entity->info.directory; -#ifdef USE_OLD_ADD - add_directory(c, tmp); -#else - if (mpdclient_cmd_add_path_utf8(c, dir->path) == 0) { - char *tmp = utf8_to_locale(dir->path); - - screen_status_printf(_("Adding \'%s\' to playlist\n"), tmp); - g_free(tmp); - } -#endif - } - - if( entry->entity->type!=MPD_INFO_ENTITY_TYPE_SONG ) - continue; - - entry->flags |= HIGHLIGHT; - - if( entry->flags & HIGHLIGHT ) { - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entry->entity->info.song; - - if( mpdclient_cmd_add(c, song) == 0 ) { - char buf[BUFSIZE]; - - strfsong(buf, BUFSIZE, LIST_FORMAT, song); - screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); - } - } - } - /* - else { - //remove song from playlist - if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entry->entity->info.song; - - if( song ) { - int idx = playlist_get_index_from_file(c, song->file); - - while( (idx=playlist_get_index_from_file(c, song->file))>=0 ) - mpdclient_cmd_delete(c, idx); - } - } - } - */ - return 0; - } - - fl->list = temp; - return 0; -} - static void browse_init(WINDOW *w, int cols, int rows) { @@ -612,7 +191,7 @@ browse_paint(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) { browser.lw->clear = 1; - list_window_paint(browser.lw, browse_lw_callback, browser.filelist); + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); wnoutrefresh(browser.lw->w); } @@ -625,63 +204,25 @@ browse_update(screen_t *screen, mpdclient_t *c) return; } - list_window_paint(browser.lw, browse_lw_callback, browser.filelist); + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); wnoutrefresh(browser.lw->w); } - -#ifdef HAVE_GETMOUSE -int -browse_handle_mouse_event(screen_t *screen, - mpdclient_t *c, - list_window_t *local_lw, - mpdclient_filelist_t *fl) -{ - int row; - unsigned prev_selected = local_lw->selected; - unsigned long bstate; - int length; - - if ( fl ) - length = fl->length; - else - length = 0; - - if( screen_get_mouse_event(c, local_lw, length, &bstate, &row) ) - return 1; - - local_lw->selected = local_lw->start+row; - list_window_check_selected(local_lw, length); - - if( bstate & BUTTON1_CLICKED ) { - if( prev_selected == local_lw->selected ) - browse_handle_enter(screen, c, local_lw, fl); - } else if( bstate & BUTTON3_CLICKED ) { - if( prev_selected == local_lw->selected ) - browse_handle_select(screen, c, local_lw, fl); - } - - return 1; -} -#endif - static int browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) { switch(cmd) { case CMD_PLAY: - browse_handle_enter(screen, c, browser.lw, - browser.filelist); + browser_handle_enter(&browser, c); return 1; case CMD_GO_ROOT_DIRECTORY: - return change_directory(screen, c, NULL, ""); + return browser_change_directory(&browser, c, NULL, ""); break; case CMD_GO_PARENT_DIRECTORY: - return change_directory(screen, c, NULL, ".."); + return browser_change_directory(&browser, c, NULL, ".."); break; case CMD_SELECT: - if (browse_handle_select(screen, c, browser.lw, - browser.filelist) == 0) { + if (browser_handle_select(&browser, c) == 0) { /* continue and select next item... */ cmd = CMD_LIST_NEXT; } @@ -726,11 +267,10 @@ browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) case CMD_LIST_RFIND_NEXT: return screen_find(screen, browser.lw, browser.filelist->length, - cmd, browse_lw_callback, + cmd, browser_lw_callback, browser.filelist); case CMD_MOUSE_EVENT: - return browse_handle_mouse_event(screen,c, browser.lw, - browser.filelist); + return browser_handle_mouse_event(&browser, c); default: break; } diff --git a/src/screen_search.c b/src/screen_search.c index 02ba2d1..365a23c 100644 --- a/src/screen_search.c +++ b/src/screen_search.c @@ -399,7 +399,7 @@ paint(mpd_unused screen_t *screen, mpdclient_t *c) if (browser.filelist) { browser.lw->flags = 0; - list_window_paint(browser.lw, browse_lw_callback, browser.filelist); + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); browser.filelist->updated = FALSE; } else { browser.lw->flags = LW_HIDE_CURSOR; @@ -421,7 +421,7 @@ update(screen_t *screen, mpdclient_t *c) return; } - list_window_paint(browser.lw, browse_lw_callback, browser.filelist); + list_window_paint(browser.lw, browser_lw_callback, browser.filelist); wnoutrefresh(browser.lw->w); } @@ -448,12 +448,11 @@ search_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) { switch (cmd) { case CMD_PLAY: - browse_handle_enter(screen, c, browser.lw, browser.filelist); + browser_handle_enter(&browser, c); return 1; case CMD_SELECT: - if (browse_handle_select(screen, c, browser.lw, - browser.filelist) == 0) { + if (browser_handle_select(&browser, c) == 0) { /* continue and select next item... */ cmd = CMD_LIST_NEXT; } @@ -461,8 +460,7 @@ search_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) return list_window_cmd(browser.lw, browser.filelist->length, cmd); case CMD_SELECT_ALL: - browse_handle_select_all(screen, c, browser.lw, - browser.filelist); + browser_handle_select_all(&browser, c); paint (screen, c); return 0; @@ -500,14 +498,13 @@ search_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) if (browser.filelist) return screen_find(screen, browser.lw, browser.filelist->length, - cmd, browse_lw_callback, + cmd, browser_lw_callback, browser.filelist); else return 1; case CMD_MOUSE_EVENT: - return browse_handle_mouse_event(screen, c, browser.lw, - browser.filelist); + return browser_handle_mouse_event(&browser, c); default: if (browser.filelist) -- 2.30.2