diff --git a/screen_play.c b/screen_play.c
index 5f93ad09331e0108cb57f05af4b7488d292b39c9..c9fd248ebea50f172bf432d1530099413164582a 100644 (file)
--- a/screen_play.c
+++ b/screen_play.c
#include <ncurses.h>
#include "config.h"
+#include "options.h"
#include "support.h"
#include "libmpdclient.h"
#include "mpc.h"
return mpc_get_song_name(song);
}
+static int
+center_playing_item(screen_t *screen, mpd_client_t *c)
+{
+ list_window_t *lw = screen->playlist;
+ int length = c->playlist_length;
+ int offset = lw->selected-lw->start;
+
+ if( !lw || length<lw->rows || !IS_PLAYING(c->status->state) )
+ return 0;
+
+ /* try to center the song that are playing */
+ lw->start = c->song_id-(lw->rows/2);
+ if( lw->start+lw->rows > length )
+ lw->start = length-lw->rows;
+ if( lw->start<0 )
+ lw->start=0;
+
+ /* make sure the cursor is in the window */
+ lw->selected = lw->start+offset;
+ list_window_check_selected(lw, length);
+
+ lw->clear = 1;
+ lw->repaint = 1;
+
+ return 0;
+}
+
static int
handle_save_playlist(screen_t *screen, mpd_client_t *c)
{
/* send save command to mpd */
mpd_sendSaveCommand(c->connection, filename_utf8);
mpd_finishCommand(c->connection);
- free(filename_utf8);
+ g_free(filename_utf8);
/* handle errors */
if( mpc_error(c))
{
{
char *str = utf8_to_locale(mpc_error_str(c));
screen_status_message(str);
- free(str);
+ g_free(str);
}
else
screen_status_printf("Error: Unable to save playlist as %s", filename);
}
/* success */
screen_status_printf("Saved %s", filename);
- free(filename);
+ g_free(filename);
/* update the file list if it has been initalized */
if( c->filelist )
{
void
play_update(screen_t *screen, mpd_client_t *c)
{
+ if( options.auto_center )
+ {
+ static int prev_song_id = 0;
+
+ if( prev_song_id != c->song_id )
+ {
+ center_playing_item(screen, c);
+ prev_song_id = c->song_id;
+ }
+ }
+
if( c->playlist_updated )
{
if( screen->playlist->selected >= c->playlist_length )
{
case CMD_DELETE:
song = mpc_playlist_get_song(c, screen->playlist->selected);
- file_clear_highlight(c, song);
- mpd_sendDeleteCommand(c->connection, screen->playlist->selected);
- mpd_finishCommand(c->connection);
- screen_status_printf("Removed \'%s\' from playlist!",
- mpc_get_song_name(song));
+ if( song )
+ {
+ file_clear_highlight(c, song);
+ mpd_sendDeleteCommand(c->connection, screen->playlist->selected);
+ mpd_finishCommand(c->connection);
+ screen_status_printf("Removed \'%s\' from playlist!",
+ mpc_get_song_name(song));
+ }
return 1;
case CMD_SAVE_PLAYLIST:
handle_save_playlist(screen, c);
return 1;
+ case CMD_SCREEN_UPDATE:
+ center_playing_item(screen, c);
+ return 1;
case CMD_LIST_FIND:
case CMD_LIST_RFIND:
case CMD_LIST_FIND_NEXT: