diff --git a/src/screen_queue.c b/src/screen_queue.c
index 4eb3c734e8614c58085edf9c0176d0436d340140..31c4dcc8a93ad0801cf84e01c8dc9afd7022702e 100644 (file)
--- a/src/screen_queue.c
+++ b/src/screen_queue.c
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2009 The Music Player Daemon Project
+ * (c) 2004-2010 The Music Player Daemon Project
* Project homepage: http://musicpd.org
*
* This program is free software; you can redistribute it and/or modify
}
static void
-center_playing_item(struct mpdclient *c, bool center_cursor)
+center_playing_item(const struct mpd_status *status, bool center_cursor)
{
int idx;
+ if (status == NULL ||
+ (mpd_status_get_state(status) != MPD_STATE_PLAY &&
+ mpd_status_get_state(status) != MPD_STATE_PAUSE))
+ return;
+
/* try to center the song that are playing */
- idx = playlist_get_index(&c->playlist, c->song);
+ idx = mpd_status_get_song_pos(status);
if (idx < 0)
return;
list_window_fetch_cursor(lw);
}
+G_GNUC_PURE
+static int
+get_current_song_id(const struct mpd_status *status)
+{
+ return status != NULL &&
+ (mpd_status_get_state(status) == MPD_STATE_PLAY ||
+ mpd_status_get_state(status) == MPD_STATE_PAUSE)
+ ? (int)mpd_status_get_song_id(status)
+ : -1;
+}
+
+static bool
+screen_queue_song_change(const struct mpd_status *status)
+{
+ if (get_current_song_id(status) == current_song_id)
+ return false;
+
+ current_song_id = get_current_song_id(status);
+
+ /* center the cursor */
+ if (options.auto_center && !lw->range_selection)
+ center_playing_item(status, false);
+
+ return true;
+}
+
#ifndef NCMPC_MINI
static void
save_pre_completion_cb(GCompletion *gcmp, G_GNUC_UNUSED gchar *line,
/* send save command to mpd */
connection = mpdclient_get_connection(c);
- if (connection == NULL)
+ if (connection == NULL) {
+ g_free(filename);
return -1;
+ }
filename_utf8 = locale_to_utf8(filename);
if (!mpd_run_save(connection, filename_utf8)) {
handle_add_to_playlist(struct mpdclient *c)
{
gchar *path;
-#ifndef NCMPC_MINI
GCompletion *gcmp;
+#ifndef NCMPC_MINI
GList *list = NULL;
GList *dir_list = NULL;
completion_callback_data_t data;
wrln_completion_callback_data = &data;
wrln_pre_completion_callback = add_pre_completion_cb;
wrln_post_completion_callback = add_post_completion_cb;
+#else
+ gcmp = NULL;
#endif
/* get path */
path = screen_readln(_("Add"),
NULL,
NULL,
-#ifdef NCMPC_MINI
- NULL
-#else
- gcmp
-#endif
- );
+ gcmp);
/* destroy completion data */
#ifndef NCMPC_MINI
}
screen_queue_restore_selection();
+ screen_queue_song_change(c->status);
}
static void
list_window_paint2(lw, screen_queue_paint_callback, NULL);
}
-G_GNUC_PURE
-static int
-get_current_song_id(const struct mpd_status *status)
-{
- return status != NULL &&
- (mpd_status_get_state(status) == MPD_STATE_PLAY ||
- mpd_status_get_state(status) == MPD_STATE_PAUSE)
- ? (int)mpd_status_get_song_id(status)
- : -1;
-}
-
static void
screen_queue_update(struct mpdclient *c)
{
- if (c->events & MPD_IDLE_PLAYLIST)
+ if (c->events & MPD_IDLE_QUEUE)
screen_queue_restore_selection();
+ else
+ /* the queue size may have changed, even if we havn't
+ received the QUEUE idle event yet */
+ list_window_set_length(lw, playlist_length(playlist));
- if ((c->events & MPD_IDLE_PLAYER) != 0 &&
- get_current_song_id(c->status) != current_song_id) {
- current_song_id = get_current_song_id(c->status);
-
- /* center the cursor */
- if (options.auto_center && current_song_id != -1 && ! lw->range_selection)
- center_playing_item(c, false);
-
- screen_queue_repaint();
- } else if (c->events & MPD_IDLE_PLAYLIST) {
- /* the playlist has changed, we must paint the new
- version */
+ if (((c->events & MPD_IDLE_PLAYER) != 0 &&
+ screen_queue_song_change(c->status)) ||
+ c->events & MPD_IDLE_QUEUE)
+ /* the queue or the current song has changed, we must
+ paint the new version */
screen_queue_repaint();
- }
}
#ifdef HAVE_GETMOUSE
switch(cmd) {
case CMD_SCREEN_UPDATE:
- center_playing_item(c, prev_cmd == CMD_SCREEN_UPDATE);
+ center_playing_item(c->status, prev_cmd == CMD_SCREEN_UPDATE);
screen_queue_repaint();
return false;
case CMD_SELECT_PLAYING:
case CMD_SHUFFLE:
list_window_get_range(lw, &range);
- if (range.end < range.start + 1)
+ if (range.end <= range.start + 1)
/* No range selection, shuffle all list. */
break;
lw->selected--;
lw->range_base--;
+ if (lw->range_selection)
+ list_window_scroll_to(lw, lw->range_base);
+ list_window_scroll_to(lw, lw->selected);
+
screen_queue_save_selection();
return true;
lw->selected++;
lw->range_base++;
+ if (lw->range_selection)
+ list_window_scroll_to(lw, lw->range_base);
+ list_window_scroll_to(lw, lw->selected);
+
screen_queue_save_selection();
return true;