diff --git a/src/screen_search.c b/src/screen_search.c
index 365a23c6f77413520b2383ba50e183c400e72d84..a1f5045acf0b2d42905994abb305eebcb76d3947 100644 (file)
--- a/src/screen_search.c
+++ b/src/screen_search.c
-/*
- * $Id$
- *
+/*
* (c) 2004 by Kalle Wallin <kaw@linux.se>
*
* This program is free software; you can redistribute it and/or modify
*
*/
-#include "config.h"
-
-#ifndef DISABLE_SEARCH_SCREEN
-#include "ncmpc.h"
+#include "i18n.h"
#include "options.h"
-#include "support.h"
+#include "charset.h"
#include "mpdclient.h"
#include "strfsong.h"
#include "command.h"
return NULL;
}
+static void
+paint(mpdclient_t *c);
+
+static void
+search_repaint(void)
+{
+ paint(NULL);
+ wrefresh(browser.lw->w);
+}
+
+static void
+search_repaint_if_active(void)
+{
+ if (screen_is_visible(&screen_search))
+ search_repaint();
+}
+
/* the playlist have been updated -> fix highlights */
static void
-playlist_changed_callback(mpdclient_t *c, int event, mpd_unused gpointer data)
+playlist_changed_callback(mpdclient_t *c, int event, gpointer data)
{
- if (browser.filelist == NULL)
- return;
- D("screen_search.c> playlist_callback() [%d]\n", event);
- switch(event) {
- case PLAYLIST_EVENT_CLEAR:
- clear_highlights(browser.filelist);
- break;
- default:
- sync_highlights(c, browser.filelist);
- break;
- }
+ browser_playlist_changed(&browser, c, event, data);
+ search_repaint_if_active();
}
/* sanity check search mode value */
{
if (browser.filelist) {
mpdclient_remove_playlist_callback(c, playlist_changed_callback);
- mpdclient_filelist_free(browser.filelist);
- browser.filelist = NULL;
+ filelist_free(browser.filelist);
+ browser.filelist = filelist_new(NULL);
}
if (clear_pattern && pattern) {
g_free(pattern);
if (table == SEARCH_ARTIST_TITLE) {
list = mpdclient_filelist_search(c, FALSE, MPD_TABLE_ARTIST,
local_pattern);
+ if (list == NULL)
+ list = filelist_new(NULL);
+
list2 = mpdclient_filelist_search(c, FALSE, MPD_TABLE_TITLE,
local_pattern);
+ if (list2 != NULL) {
+ filelist_move(list, list2);
+ filelist_free(list2);
+ }
- list->length += list2->length;
- list->list = g_list_concat(list->list, list2->list);
- list->list = g_list_sort(list->list, compare_filelistentry_format);
- list->updated = TRUE;
- } else
+ filelist_sort(list, compare_filelistentry_format);
+ } else {
list = mpdclient_filelist_search(c, FALSE, table, local_pattern);
+ if (list == NULL)
+ list = filelist_new(NULL);
+ }
return list;
}
i=0;
while (strv[i]) {
- D("strv[%d] = \"%s\"\n", i, strv[i]);
i++;
}
arg[j] = g_strdup_printf("%s %s", arg[j], strv[i]);
g_free(tmp);
} else {
- D("Bad search tag %s\n", strv[i]);
screen_status_printf(_("Bad search tag %s"), strv[i]);
}
i++;
} else if (strv[i+1] == NULL || strlen(strv[i+1]) == 0) {
- D("No argument for search tag %s\n", strv[i]);
screen_status_printf(_("No argument for search tag %s"), strv[i]);
i++;
// j--;
fl = g_malloc0(sizeof(mpdclient_filelist_t));
- while ((entity=mpd_getNextInfoEntity(c->connection))) {
- filelist_entry_t *entry = g_malloc0(sizeof(filelist_entry_t));
-
- entry->entity = entity;
- fl->list = g_list_append(fl->list, (gpointer) entry);
- fl->length++;
- }
+ while ((entity=mpd_getNextInfoEntity(c->connection)))
+ filelist_append(fl, entity);
if (mpdclient_finish_command(c) && fl)
- mpdclient_filelist_free(fl);
-
- fl->updated = TRUE;
+ filelist_free(fl);
}
i=0;
mode[options.search_mode].table,
pattern);
+ if (browser.filelist == NULL)
+ browser.filelist = filelist_new(NULL);
+
sync_highlights(c, browser.filelist);
mpdclient_install_playlist_callback(c, playlist_changed_callback);
- list_window_check_selected(browser.lw, browser.filelist->length);
+ list_window_check_selected(browser.lw, filelist_length(browser.filelist));
}
if (search_history)
string_list_free(search_history);
if (browser.filelist)
- mpdclient_filelist_free(browser.filelist);
+ filelist_free(browser.filelist);
list_window_free(browser.lw);
if (pattern) {
}
static void
-paint(mpd_unused screen_t *screen, mpdclient_t *c)
+paint(mpd_unused mpdclient_t *c)
{
- browser.lw->clear = 1;
-
if (browser.filelist) {
browser.lw->flags = 0;
list_window_paint(browser.lw, browser_lw_callback, browser.filelist);
- browser.filelist->updated = FALSE;
} else {
browser.lw->flags = LW_HIDE_CURSOR;
list_window_paint(browser.lw, lw_search_help_callback, NULL);
- if( !MPD_VERSION_LT(c, 0, 12, 0) )
- g_strdup_printf("Advanced search disabled (MPD version < 0.12.0");
- // wmove(lw->w, 0, 0);
- //wclrtobot(lw->w);
- }
-
- wnoutrefresh(browser.lw->w);
-}
-
-static void
-update(screen_t *screen, mpdclient_t *c)
-{
- if (browser.filelist == NULL || browser.filelist->updated) {
- paint(screen, c);
- return;
}
-
- list_window_paint(browser.lw, browser_lw_callback, browser.filelist);
- wnoutrefresh(browser.lw->w);
}
static const char *
search_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
{
switch (cmd) {
- case CMD_PLAY:
- browser_handle_enter(&browser, c);
- return 1;
-
- case CMD_SELECT:
- if (browser_handle_select(&browser, c) == 0) {
- /* continue and select next item... */
- cmd = CMD_LIST_NEXT;
- }
- /* call list_window_cmd to go to the next item */
- return list_window_cmd(browser.lw, browser.filelist->length, cmd);
-
- case CMD_SELECT_ALL:
- browser_handle_select_all(&browser, c);
- paint (screen, c);
- return 0;
-
case CMD_SEARCH_MODE:
options.search_mode++;
if (mode[options.search_mode].label == NULL)
pattern);
sync_highlights(c, browser.filelist);
}
+ search_repaint();
return 1;
case CMD_SCREEN_SEARCH:
search_new(screen, c);
+ search_repaint();
return 1;
case CMD_CLEAR:
search_clear(screen, c, TRUE);
list_window_reset(browser.lw);
+ search_repaint();
return 1;
- case CMD_LIST_FIND:
- case CMD_LIST_RFIND:
- case CMD_LIST_FIND_NEXT:
- case CMD_LIST_RFIND_NEXT:
- if (browser.filelist)
- return screen_find(screen,
- browser.lw, browser.filelist->length,
- cmd, browser_lw_callback,
- browser.filelist);
- else
- return 1;
-
- case CMD_MOUSE_EVENT:
- return browser_handle_mouse_event(&browser, c);
-
default:
- if (browser.filelist)
- return list_window_cmd(browser.lw,
- browser.filelist->length, cmd);
+ break;
+ }
+
+ if (browser.filelist != NULL &&
+ browser_cmd(&browser, screen, c, cmd)) {
+ search_repaint();
+ return 1;
}
return 0;
.open = open,
.resize = resize,
.paint = paint,
- .update = update,
.cmd = search_cmd,
.get_title = get_title,
};
-
-#endif /* ENABLE_SEARCH_SCREEN */