diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2024-08-07 22:12:43 +0200 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2024-08-07 22:12:43 +0200 | 
| commit | 24449fe721dfa6cf2bd1fe41ea0f0106efef0d91 (patch) | |
| tree | 331fb740cc14dbaf7633a06f1bcf700783fa78b4 | |
| parent | 60171cc5a3a2be8834aa263211a6cd9e0eb7f8fe (diff) | |
| download | nncmpp-24449fe721dfa6cf2bd1fe41ea0f0106efef0d91.tar.gz nncmpp-24449fe721dfa6cf2bd1fe41ea0f0106efef0d91.tar.xz nncmpp-24449fe721dfa6cf2bd1fe41ea0f0106efef0d91.zip | |
Make global search match on filenames
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | nncmpp.c | 32 | 
2 files changed, 33 insertions, 1 deletions
| @@ -1,6 +1,6 @@  Unreleased - * Made global search indicate the search terms + * Made global search indicate the search terms, and match on filenames  2.1.1 (2024-02-27) @@ -3616,6 +3616,21 @@ out:  	free (filter);  } +static char * +mpd_quoted_filter_string (const char *value) +{ +	struct str quoted = str_make (); +	str_append_c ("ed, '\''); +	for (const char *p = value; *p; p++) +	{ +		if (mpd_client_must_escape_in_quote (*p)) +			str_append_c ("ed, '\\'); +		str_append_c ("ed, *p); +	} +	str_append_c ("ed, '\''); +	return str_steal ("ed); +} +  static void  search_on_changed (void)  { @@ -3623,8 +3638,25 @@ search_on_changed (void)  	size_t len;  	char *u8 = (char *) u32_to_u8 (g.editor.line, g.editor.len + 1, NULL, &len); +	mpd_client_list_begin (c);  	mpd_client_send_command (c, "search", "any", u8, NULL); +	// Just tag search doesn't consider filenames. +	// Older MPD can do `search any X file X` but without the negation, +	// which is necessary to avoid duplicates.  Neither syntax supports OR. +	// XXX: We should parse this, but it's probably not going to reach 100 soon, +	//   and it is not really documented what this should even look like. +	if (strcmp (c->got_hello, "0.21.") > 1) +	{ +		char *quoted = mpd_quoted_filter_string (u8); +		char *expression = xstrdup_printf ("((!(any contains %s)) AND " +			"(file contains %s))", quoted, quoted); +		mpd_client_send_command (c, "search", expression, NULL); +		free (expression); +		free (quoted); +	} + +	mpd_client_list_end (c);  	mpd_client_add_task (c, library_tab_on_search_data, u8);  	mpd_client_idle (c, 0);  } | 
