diff --git a/src/screen_queue.c b/src/screen_queue.c
index d3624d1f544a61e446f2a6344e1622a8e8e11e83..a5383fa19927d6536db98f7f60cc0aff7450415a 100644 (file)
--- a/src/screen_queue.c
+++ b/src/screen_queue.c
#include "screen_file.h"
#include "screen_status.h"
#include "screen_find.h"
+#include "save_playlist.h"
#include "config.h"
#include "i18n.h"
#include "charset.h"
#include "screen_utils.h"
#include "screen_song.h"
#include "screen_lyrics.h"
+#include "db_completion.h"
#include "Compiler.h"
#ifndef NCMPC_MINI
#define MAX_SONG_LENGTH 512
#ifndef NCMPC_MINI
-typedef struct
-{
- GList **list;
- GList **dir_list;
- struct mpdclient *c;
-} completion_callback_data_t;
-
static struct hscroll hscroll;
#endif
return true;
}
-#ifndef NCMPC_MINI
-static void
-save_pre_completion_cb(GCompletion *gcmp, gcc_unused gchar *line,
- void *data)
-{
- completion_callback_data_t *tmp = (completion_callback_data_t *)data;
- GList **list = tmp->list;
- struct mpdclient *c = tmp->c;
-
- if( *list == NULL ) {
- /* create completion list */
- *list = gcmp_list_from_path(c, "", NULL, GCMP_TYPE_PLAYLIST);
- g_completion_add_items(gcmp, *list);
- }
-}
-
-static void
-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);
-}
-#endif
-
#ifndef NCMPC_MINI
/**
* Wrapper for strncmp(). We are not allowed to pass &strncmp to
}
#endif
-int
-playlist_save(struct mpdclient *c, char *name, char *defaultname)
-{
- struct mpd_connection *connection;
- gchar *filename;
-
-#ifdef NCMPC_MINI
- (void)defaultname;
-#endif
-
-#ifndef NCMPC_MINI
- if (name == NULL) {
- /* initialize completion support */
- GCompletion *gcmp = g_completion_new(NULL);
- g_completion_set_compare(gcmp, completion_strncmp);
- 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 queue as"),
- defaultname,
- NULL,
- gcmp);
-
- /* destroy completion support */
- wrln_completion_callback_data = NULL;
- wrln_pre_completion_callback = NULL;
- wrln_post_completion_callback = NULL;
- g_completion_free(gcmp);
- list = string_list_free(list);
- if( filename )
- filename=g_strstrip(filename);
- } else
-#endif
- filename=g_strdup(name);
-
- if (filename == NULL)
- return -1;
-
- /* send save command to mpd */
-
- connection = mpdclient_get_connection(c);
- if (connection == NULL) {
- g_free(filename);
- return -1;
- }
-
- 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 = g_strdup_printf(_("Replace %s [%s/%s] ? "),
- filename, YES, NO);
- bool replace = screen_get_yesno(buf, false);
- g_free(buf);
-
- if (!replace) {
- g_free(filename_utf8);
- g_free(filename);
- screen_status_printf(_("Aborted"));
- return -1;
- }
-
- if (!mpd_run_rm(connection, filename_utf8) ||
- !mpd_run_save(connection, filename_utf8)) {
- mpdclient_handle_error(c);
- g_free(filename_utf8);
- g_free(filename);
- return -1;
- }
- } else {
- mpdclient_handle_error(c);
- g_free(filename_utf8);
- g_free(filename);
- return -1;
- }
- }
-
- c->events |= MPD_IDLE_STORED_PLAYLIST;
-
- g_free(filename_utf8);
-
- /* success */
- screen_status_printf(_("Saved %s"), filename);
- g_free(filename);
- return 0;
-}
-
#ifndef NCMPC_MINI
static void add_dir(GCompletion *gcmp, gchar *dir, GList **dir_list,
GList **list, struct mpdclient *c)
*dir_list = g_list_append(*dir_list, g_strdup(dir));
}
+struct completion_callback_data {
+ GList **list;
+ GList **dir_list;
+ struct mpdclient *c;
+};
+
static void add_pre_completion_cb(GCompletion *gcmp, gchar *line, void *data)
{
- completion_callback_data_t *tmp = (completion_callback_data_t *)data;
+ struct completion_callback_data *tmp = data;
GList **dir_list = tmp->dir_list;
GList **list = tmp->list;
struct mpdclient *c = tmp->c;
static void add_post_completion_cb(GCompletion *gcmp, gchar *line,
GList *items, void *data)
{
- completion_callback_data_t *tmp = (completion_callback_data_t *)data;
+ struct completion_callback_data *tmp = data;
GList **dir_list = tmp->dir_list;
GList **list = tmp->list;
struct mpdclient *c = tmp->c;
GList *list = NULL;
GList *dir_list = NULL;
- completion_callback_data_t data = {
+ struct completion_callback_data data = {
.list = &list,
.dir_list = &dir_list,
.c = 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);
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;
}
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();
}
static void
-screen_queue_resize(int cols, int rows)
+screen_queue_resize(unsigned cols, unsigned rows)
{
list_window_resize(lw, cols, rows);
}
list_window_free(lw);
}
+/**
+ * Extract the host portion (without the optional password) from the
+ * MPD_HOST string.
+ */
+static const char *
+host_without_password(const char *host)
+{
+ const char *separator = strchr(host, '@');
+ if (separator != NULL && separator != host && separator[1] != 0)
+ host = separator + 1;
+
+ return host;
+}
+
static const char *
screen_queue_title(char *str, size_t size)
{
if (options.host == NULL)
return _("Queue");
- g_snprintf(str, size, _("Queue on %s"), options.host);
+ g_snprintf(str, size, _("Queue on %s"),
+ host_without_password(options.host));
return str;
}
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
int row;
if (screen_get_mouse_event(c, &bstate, &row) ||
list_window_mouse(lw, bstate, row)) {
- screen_queue_repaint();
+ screen_queue_paint();
return true;
}
}
screen_queue_save_selection();
- screen_queue_repaint();
+ screen_queue_paint();
return true;
}
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:
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, NULL);
screen_queue_save_selection();
- screen_queue_repaint();
+ screen_queue_paint();
return true;
#ifdef HAVE_GETMOUSE