X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_queue.c;h=d364c910a5c0ae8e0c91f8ff707e1414361e305d;hb=26efd1aa493c9c25cfbd167f225d48203ec8620b;hp=31c4dcc8a93ad0801cf84e01c8dc9afd7022702e;hpb=25da2d1db787625b7f712e556a28848356667367;p=ncmpc.git diff --git a/src/screen_queue.c b/src/screen_queue.c index 31c4dcc..d364c91 100644 --- a/src/screen_queue.c +++ b/src/screen_queue.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2010 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -20,7 +20,7 @@ #include "screen_queue.h" #include "screen_interface.h" #include "screen_file.h" -#include "screen_message.h" +#include "screen_status.h" #include "screen_find.h" #include "config.h" #include "i18n.h" @@ -35,6 +35,7 @@ #include "screen_utils.h" #include "screen_song.h" #include "screen_lyrics.h" +#include "Compiler.h" #ifndef NCMPC_MINI #include "hscroll.h" @@ -95,22 +96,19 @@ screen_queue_save_selection(void) static void screen_queue_restore_selection(void) { - const struct mpd_song *song; - int pos; - list_window_set_length(lw, playlist_length(playlist)); if (selected_song_id < 0) /* there was no selection */ return; - song = screen_queue_selected_song(); + const struct mpd_song *song = screen_queue_selected_song(); if (song != NULL && mpd_song_get_id(song) == (unsigned)selected_song_id) /* selection is still valid */ return; - pos = playlist_get_index_from_id(playlist, selected_song_id); + int pos = playlist_get_index_from_id(playlist, selected_song_id); if (pos >= 0) list_window_set_cursor(lw, pos); @@ -118,15 +116,14 @@ screen_queue_restore_selection(void) } static const char * -screen_queue_lw_callback(unsigned idx, G_GNUC_UNUSED void *data) +screen_queue_lw_callback(unsigned idx, gcc_unused void *data) { static char songname[MAX_SONG_LENGTH]; - struct mpd_song *song; assert(playlist != NULL); assert(idx < playlist_length(playlist)); - song = playlist_get(playlist, idx); + struct mpd_song *song = playlist_get(playlist, idx); strfsong(songname, MAX_SONG_LENGTH, options.list_format, song); @@ -136,15 +133,13 @@ screen_queue_lw_callback(unsigned idx, G_GNUC_UNUSED void *data) static void 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 = mpd_status_get_song_pos(status); + int idx = mpd_status_get_song_pos(status); if (idx < 0) return; @@ -159,7 +154,7 @@ center_playing_item(const struct mpd_status *status, bool center_cursor) list_window_fetch_cursor(lw); } -G_GNUC_PURE +gcc_pure static int get_current_song_id(const struct mpd_status *status) { @@ -187,7 +182,7 @@ screen_queue_song_change(const struct mpd_status *status) #ifndef NCMPC_MINI static void -save_pre_completion_cb(GCompletion *gcmp, G_GNUC_UNUSED gchar *line, +save_pre_completion_cb(GCompletion *gcmp, gcc_unused gchar *line, void *data) { completion_callback_data_t *tmp = (completion_callback_data_t *)data; @@ -202,9 +197,9 @@ save_pre_completion_cb(GCompletion *gcmp, G_GNUC_UNUSED gchar *line, } static void -save_post_completion_cb(G_GNUC_UNUSED GCompletion *gcmp, - G_GNUC_UNUSED gchar *line, GList *items, - G_GNUC_UNUSED void *data) +save_post_completion_cb(gcc_unused GCompletion *gcmp, + gcc_unused gchar *line, GList *items, + gcc_unused void *data) { if (g_list_length(items) >= 1) screen_display_completion_list(items); @@ -228,12 +223,7 @@ int playlist_save(struct mpdclient *c, char *name, char *defaultname) { struct mpd_connection *connection; - gchar *filename, *filename_utf8; -#ifndef NCMPC_MINI - GCompletion *gcmp; - GList *list = NULL; - completion_callback_data_t data; -#endif + gchar *filename; #ifdef NCMPC_MINI (void)defaultname; @@ -242,18 +232,21 @@ playlist_save(struct mpdclient *c, char *name, char *defaultname) #ifndef NCMPC_MINI if (name == NULL) { /* initialize completion support */ - gcmp = g_completion_new(NULL); + GCompletion *gcmp = g_completion_new(NULL); g_completion_set_compare(gcmp, completion_strncmp); - data.list = &list; - data.dir_list = NULL; - data.c = c; + GList *list = NULL; + completion_callback_data_t data = { + .list = &list, + .dir_list = NULL, + .c = c, + }; wrln_completion_callback_data = &data; wrln_pre_completion_callback = save_pre_completion_cb; wrln_post_completion_callback = save_post_completion_cb; /* query the user for a filename */ - filename = screen_readln(_("Save playlist as"), + filename = screen_readln(_("Save queue as"), defaultname, NULL, gcmp); @@ -268,7 +261,7 @@ playlist_save(struct mpdclient *c, char *name, char *defaultname) filename=g_strstrip(filename); } else #endif - filename=g_strdup(name); + filename=g_strdup(name); if (filename == NULL) return -1; @@ -281,20 +274,17 @@ playlist_save(struct mpdclient *c, char *name, char *defaultname) return -1; } - filename_utf8 = locale_to_utf8(filename); + char *filename_utf8 = locale_to_utf8(filename); if (!mpd_run_save(connection, filename_utf8)) { if (mpd_connection_get_error(connection) == MPD_ERROR_SERVER && mpd_connection_get_server_error(connection) == MPD_SERVER_ERROR_EXIST && mpd_connection_clear_error(connection)) { - char *buf; - int key; - - buf = g_strdup_printf(_("Replace %s [%s/%s] ? "), - filename, YES, NO); - key = tolower(screen_getch(buf)); + char *buf = g_strdup_printf(_("Replace %s [%s/%s] ? "), + filename, YES, NO); + bool replace = screen_get_yesno(buf, false); g_free(buf); - if (key != YES[0]) { + if (!replace) { g_free(filename_utf8); g_free(filename); screen_status_printf(_("Aborted")); @@ -377,31 +367,31 @@ static void add_post_completion_cb(GCompletion *gcmp, gchar *line, static int handle_add_to_playlist(struct mpdclient *c) { - gchar *path; - GCompletion *gcmp; #ifndef NCMPC_MINI + /* initialize completion support */ + GCompletion *gcmp = g_completion_new(NULL); + g_completion_set_compare(gcmp, completion_strncmp); + GList *list = NULL; GList *dir_list = NULL; - completion_callback_data_t data; + completion_callback_data_t data = { + .list = &list, + .dir_list = &dir_list, + .c = c, + }; - /* initialize completion support */ - gcmp = g_completion_new(NULL); - g_completion_set_compare(gcmp, completion_strncmp); - data.list = &list; - data.dir_list = &dir_list; - data.c = c; wrln_completion_callback_data = &data; wrln_pre_completion_callback = add_pre_completion_cb; wrln_post_completion_callback = add_post_completion_cb; #else - gcmp = NULL; + GCompletion *gcmp = NULL; #endif /* get path */ - path = screen_readln(_("Add"), - NULL, - NULL, - gcmp); + char *path = screen_readln(_("Add"), + NULL, + NULL, + gcmp); /* destroy completion data */ #ifndef NCMPC_MINI @@ -425,7 +415,7 @@ handle_add_to_playlist(struct mpdclient *c) } static void -screen_queue_init(WINDOW *w, int cols, int rows) +screen_queue_init(WINDOW *w, unsigned cols, unsigned rows) { lw = list_window_init(w, cols, rows); @@ -452,8 +442,8 @@ timer_hide_cursor(gpointer data) lw->hide_cursor = true; screen_queue_repaint(); } else - timer_hide_cursor_id = g_timeout_add(options.hide_cursor * 1000, - timer_hide_cursor, c); + timer_hide_cursor_id = g_timeout_add_seconds(options.hide_cursor, + timer_hide_cursor, c); return FALSE; } @@ -466,8 +456,8 @@ screen_queue_open(struct mpdclient *c) assert(timer_hide_cursor_id == 0); if (options.hide_cursor > 0) { lw->hide_cursor = false; - timer_hide_cursor_id = g_timeout_add(options.hide_cursor * 1000, - timer_hide_cursor, c); + timer_hide_cursor_id = g_timeout_add_seconds(options.hide_cursor, + timer_hide_cursor, c); } screen_queue_restore_selection(); @@ -489,7 +479,7 @@ screen_queue_close(void) } static void -screen_queue_resize(int cols, int rows) +screen_queue_resize(unsigned cols, unsigned rows) { list_window_resize(lw, cols, rows); } @@ -505,35 +495,31 @@ static const char * screen_queue_title(char *str, size_t size) { if (options.host == NULL) - return _("Playlist"); + return _("Queue"); - g_snprintf(str, size, _("Playlist on %s"), options.host); + g_snprintf(str, size, _("Queue on %s"), options.host); return str; } static void screen_queue_paint_callback(WINDOW *w, unsigned i, unsigned y, unsigned width, - bool selected, G_GNUC_UNUSED void *data) + bool selected, gcc_unused const void *data) { - const struct mpd_song *song; - struct hscroll *row_hscroll; - assert(playlist != NULL); assert(i < playlist_length(playlist)); - song = playlist_get(playlist, i); + const struct mpd_song *song = playlist_get(playlist, i); -#ifdef NCMPC_MINI - row_hscroll = NULL; -#else + struct hscroll *row_hscroll = NULL; +#ifndef NCMPC_MINI row_hscroll = selected && options.scroll && lw->selected == i ? &hscroll : NULL; #endif paint_song_row(w, y, width, selected, (int)mpd_song_get_id(song) == current_song_id, - song, row_hscroll); + song, row_hscroll, options.list_format); } static void @@ -562,20 +548,18 @@ screen_queue_update(struct mpdclient *c) c->events & MPD_IDLE_QUEUE) /* the queue or the current song has changed, we must paint the new version */ - screen_queue_repaint(); + screen_queue_paint(); } #ifdef HAVE_GETMOUSE static bool handle_mouse_event(struct mpdclient *c) { - int row; unsigned long bstate; - unsigned old_selected; - + int row; if (screen_get_mouse_event(c, &bstate, &row) || list_window_mouse(lw, bstate, row)) { - screen_queue_repaint(); + screen_queue_paint(); return true; } @@ -585,7 +569,7 @@ handle_mouse_event(struct mpdclient *c) return true; } - old_selected = lw->selected; + const unsigned old_selected = lw->selected; list_window_set_cursor(lw, lw->start + row); if (bstate & BUTTON1_CLICKED) { @@ -609,7 +593,7 @@ handle_mouse_event(struct mpdclient *c) } screen_queue_save_selection(); - screen_queue_repaint(); + screen_queue_paint(); return true; } @@ -620,10 +604,8 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) { struct mpd_connection *connection; static command_t cached_cmd = CMD_NONE; - command_t prev_cmd = cached_cmd; - struct list_window_range range; - const struct mpd_song *song; + const command_t prev_cmd = cached_cmd; cached_cmd = cmd; lw->hide_cursor = false; @@ -631,26 +613,26 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) if (options.hide_cursor > 0) { if (timer_hide_cursor_id != 0) g_source_remove(timer_hide_cursor_id); - timer_hide_cursor_id = g_timeout_add(options.hide_cursor * 1000, - timer_hide_cursor, c); + timer_hide_cursor_id = g_timeout_add_seconds(options.hide_cursor, + timer_hide_cursor, c); } if (list_window_cmd(lw, cmd)) { screen_queue_save_selection(); - screen_queue_repaint(); + screen_queue_paint(); return true; } switch(cmd) { case CMD_SCREEN_UPDATE: center_playing_item(c->status, prev_cmd == CMD_SCREEN_UPDATE); - screen_queue_repaint(); + screen_queue_paint(); return false; case CMD_SELECT_PLAYING: list_window_set_cursor(lw, playlist_get_index(&c->playlist, c->song)); screen_queue_save_selection(); - screen_queue_repaint(); + screen_queue_paint(); return true; case CMD_LIST_FIND: @@ -659,12 +641,12 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) case CMD_LIST_RFIND_NEXT: screen_find(lw, cmd, screen_queue_lw_callback, NULL); screen_queue_save_selection(); - screen_queue_repaint(); + screen_queue_paint(); return true; case CMD_LIST_JUMP: - screen_jump(lw, screen_queue_lw_callback, NULL, NULL); + screen_jump(lw, screen_queue_lw_callback, NULL, NULL, NULL); screen_queue_save_selection(); - screen_queue_repaint(); + screen_queue_paint(); return true; #ifdef HAVE_GETMOUSE @@ -700,7 +682,10 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) break; #endif case CMD_SCREEN_SWAP: - screen_swap(c, playlist_get(&c->playlist, lw->selected)); + if (playlist_length(&c->playlist) > 0) + screen_swap(c, playlist_get(&c->playlist, lw->selected)); + else + screen_swap(c, NULL); return true; default: @@ -711,6 +696,9 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) return false; switch(cmd) { + const struct mpd_song *song; + struct list_window_range range; + case CMD_PLAY: song = screen_queue_selected_song(); if (song == NULL) @@ -749,7 +737,7 @@ screen_queue_cmd(struct mpdclient *c, command_t cmd) return true; if (mpd_run_shuffle_range(connection, range.start, range.end)) - screen_status_message(_("Shuffled playlist")); + screen_status_message(_("Shuffled queue")); else mpdclient_handle_error(c); return true;