X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_play.c;h=b9b0ecb0f18606cf639f905a76ef31728cf201a4;hb=a00c1bb99e0706ef8a59f14baae76f194f27d7db;hp=7ee0a9ff487817967d9957e100eab7111a553bbc;hpb=45352152fbdcac20b39161069406ad6d5288bd98;p=ncmpc.git diff --git a/src/screen_play.c b/src/screen_play.c index 7ee0a9f..b9b0ecb 100644 --- a/src/screen_play.c +++ b/src/screen_play.c @@ -1,26 +1,26 @@ -/* - * (c) 2004 by Kalle Wallin - * +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2009 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * 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 - * - */ + + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ #include "config.h" #include "i18n.h" #include "charset.h" #include "options.h" -#include "support.h" #include "mpdclient.h" #include "utils.h" #include "strfsong.h" @@ -31,6 +31,10 @@ #include "screen_utils.h" #include "screen_play.h" +#ifndef NCMPC_MINI +#include "hscroll.h" +#endif + #include #include #include @@ -77,9 +81,12 @@ playlist_changed_callback(mpdclient_t *c, int event, gpointer data) case PLAYLIST_EVENT_DELETE: break; case PLAYLIST_EVENT_MOVE: - lw->selected = *((int *) data); - if (lw->selected < lw->start) - lw->start--; + if(lw->visual_selection < 0) + { + lw->selected = *((int *) data); + if (lw->selected < lw->start) + lw->start--; + } break; default: break; @@ -133,7 +140,6 @@ static void center_playing_item(mpdclient_t *c) { unsigned length = c->playlist.list->len; - unsigned offset = lw->selected - lw->start; int idx; if (!c->song || length < lw->rows || @@ -148,8 +154,25 @@ center_playing_item(mpdclient_t *c) list_window_center(lw, length, idx); /* make sure the cursor is in the window */ - lw->selected = lw->start+offset; - list_window_check_selected(lw, length); + if (lw->selected < lw->start) { + lw->selected = lw->start; + if (lw->visual_selection) { + lw->selected_start = lw->visual_base; + lw->selected_end = lw->selected; + } else { + lw->selected_start = lw->selected; + lw->selected_end = lw->selected; + } + } else if (lw->selected > lw->start + lw->rows - 1) { + lw->selected = lw->start + lw->rows - 1; + if (lw->visual_selection) { + lw->selected_start = lw->selected; + lw->selected_end = lw->visual_base; + } else { + lw->selected_start = lw->selected; + lw->selected_end = lw->selected; + } + } } #ifndef NCMPC_MINI @@ -178,6 +201,19 @@ save_post_completion_cb(G_GNUC_UNUSED GCompletion *gcmp, } #endif +#ifndef NCMPC_MINI +/** + * Wrapper for strncmp(). We are not allowed to pass &strncmp to + * g_completion_set_compare(), because strncmp() takes size_t where + * g_completion_set_compare passes a gsize value. + */ +static gint +completion_strncmp(const gchar *s1, const gchar *s2, gsize n) +{ + return strncmp(s1, s2, n); +} +#endif + int playlist_save(mpdclient_t *c, char *name, char *defaultname) { @@ -197,7 +233,7 @@ playlist_save(mpdclient_t *c, char *name, char *defaultname) if (name == NULL) { /* initialize completion support */ gcmp = g_completion_new(NULL); - g_completion_set_compare(gcmp, strncmp); + g_completion_set_compare(gcmp, completion_strncmp); data.list = &list; data.dir_list = NULL; data.c = c; @@ -208,7 +244,7 @@ playlist_save(mpdclient_t *c, char *name, char *defaultname) /* query the user for a filename */ filename = screen_readln(screen.status_window.w, - _("Save playlist as: "), + _("Save playlist as"), defaultname, NULL, gcmp); @@ -335,7 +371,7 @@ handle_add_to_playlist(mpdclient_t *c) /* initialize completion support */ gcmp = g_completion_new(NULL); - g_completion_set_compare(gcmp, strncmp); + g_completion_set_compare(gcmp, completion_strncmp); data.list = &list; data.dir_list = &dir_list; data.c = c; @@ -346,7 +382,7 @@ handle_add_to_playlist(mpdclient_t *c) /* get path */ path = screen_readln(screen.status_window.w, - _("Add: "), + _("Add"), NULL, NULL, #ifdef NCMPC_MINI @@ -396,7 +432,7 @@ timer_hide_cursor(gpointer data) /* hide the cursor when mpd is playing and the user is inactive */ if (c->status != NULL && c->status->state == MPD_STATUS_STATE_PLAY) { - lw->flags |= LW_HIDE_CURSOR; + lw->hide_cursor = true; playlist_repaint(); } else timer_hide_cursor_id = g_timeout_add(options.hide_cursor * 1000, @@ -414,7 +450,7 @@ play_open(mpdclient_t *c) assert(timer_hide_cursor_id == 0); if (options.hide_cursor > 0) { - lw->flags &= ~LW_HIDE_CURSOR; + lw->hide_cursor = false; timer_hide_cursor_id = g_timeout_add(options.hide_cursor * 1000, timer_hide_cursor, c); } @@ -472,18 +508,20 @@ play_update(mpdclient_t *c) current_song_id = c->song != NULL && c->status != NULL && !IS_STOPPED(c->status->state) ? c->song->id : -1; - if (current_song_id != prev_song_id -#ifndef NCMPC_MINI - || options.scroll -#endif - ) { + if (current_song_id != prev_song_id) { prev_song_id = current_song_id; /* center the cursor */ - if (options.auto_center && current_song_id != -1) + if (options.auto_center && current_song_id != -1 && ! lw->visual_selection) center_playing_item(c); playlist_repaint(); +#ifndef NCMPC_MINI + } else if (options.scroll) { + /* always repaint if horizontal scrolling is + enabled */ + playlist_repaint(); +#endif } } @@ -530,7 +568,7 @@ handle_mouse_event(struct mpdclient *c) static bool play_cmd(mpdclient_t *c, command_t cmd) { - lw->flags &= ~LW_HIDE_CURSOR; + lw->hide_cursor = false; if (options.hide_cursor > 0) { if (timer_hide_cursor_id != 0) @@ -549,8 +587,21 @@ play_cmd(mpdclient_t *c, command_t cmd) mpdclient_cmd_play(c, lw->selected); return true; case CMD_DELETE: - mpdclient_cmd_delete(c, lw->selected); + { + int i = lw->selected_end, start = lw->selected_start; + for(; i >= start; --i) + mpdclient_cmd_delete(c, i); + + i++; + if(i >= (int)playlist_length(&c->playlist)) + i--; + lw->selected = i; + lw->selected_start = i; + lw->selected_end = i; + lw->visual_selection = false; + return true; + } case CMD_SAVE_PLAYLIST: playlist_save(c, NULL, NULL); return true; @@ -561,12 +612,60 @@ play_cmd(mpdclient_t *c, command_t cmd) center_playing_item(c); playlist_repaint(); return false; + case CMD_SHUFFLE: + { + if(!lw->visual_selection) + /* No visual selection, shuffle all list. */ + break; + + if (mpdclient_cmd_shuffle_range(c, lw->selected_start, lw->selected_end+1) == 0) + screen_status_message(_("Shuffled playlist")); + return true; + } case CMD_LIST_MOVE_UP: - mpdclient_cmd_move(c, lw->selected, lw->selected-1); + if(lw->selected_start == 0) + return false; + if(lw->visual_selection) + { + unsigned i = lw->selected_start; + unsigned last_selected = lw->selected; + for(; i <= lw->selected_end; ++i) + mpdclient_cmd_move(c, i, i-1); + lw->selected_start--; + lw->selected_end--; + lw->selected = last_selected - 1; + lw->visual_base--; + } + else + { + mpdclient_cmd_move(c, lw->selected, lw->selected-1); + lw->selected--; + lw->selected_start--; + lw->selected_end--; + } return true; case CMD_LIST_MOVE_DOWN: - mpdclient_cmd_move(c, lw->selected, lw->selected+1); + if(lw->selected_end+1 >= playlist_length(&c->playlist)) + return false; + if(lw->visual_selection) + { + int i = lw->selected_end; + unsigned last_selected = lw->selected; + for(; i >= (int)lw->selected_start; --i) + mpdclient_cmd_move(c, i, i+1); + lw->selected_start++; + lw->selected_end++; + lw->selected = last_selected + 1; + lw->visual_base++; + } + else + { + mpdclient_cmd_move(c, lw->selected, lw->selected+1); + lw->selected++; + lw->selected_start++; + lw->selected_end++; + } return true; case CMD_LIST_FIND: case CMD_LIST_RFIND: @@ -576,6 +675,10 @@ play_cmd(mpdclient_t *c, command_t cmd) cmd, list_callback, NULL); playlist_repaint(); return true; + case CMD_LIST_JUMP: + screen_jump(lw, list_callback, NULL); + playlist_repaint(); + return true; #ifdef HAVE_GETMOUSE case CMD_MOUSE_EVENT: