Merge branch 'prefix_match_more_prominence' into 'main'

GDesktopAppInfo: prioritize match_type over match_category when searching apps

Closes #3082

See merge request GNOME/glib!3592
This commit is contained in:
Philip Withnall 2023-10-03 08:40:14 +00:00
commit 74d2586d7c
3 changed files with 56 additions and 12 deletions

View File

@ -458,7 +458,9 @@ const gchar desktop_key_match_category[N_DESKTOP_KEYS] = {
typedef enum {
/* Lower numbers have higher priority.
* Prefix match should put before substring match.
* Prefix match should put before substring match, independently of
* category relevance, i.e. a prefix match in 'Keyword' category will
* come before a substring match in a more relevant category like 'Name'.
*/
MATCH_TYPE_PREFIX = 1,
MATCH_TYPE_SUBSTRING = 2
@ -576,7 +578,10 @@ compare_results (gconstpointer a,
}
else
{
if (ra->category == rb->category)
/* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword'
* category is better than a substring match in a more relevance category like 'Name'.
*/
if (ra->match_type != rb->match_type)
return ra->match_type - rb->match_type;
return ra->category - rb->category;
@ -590,10 +595,10 @@ compare_categories (gconstpointer a,
const struct search_result *ra = a;
const struct search_result *rb = b;
/* Also compare match types so we can put prefix match in a group while
* substring match in another group.
/* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword'
* category is better than a substring match in a more relevance category like 'Name'.
*/
if (ra->category == rb->category)
if (ra->match_type != rb->match_type)
return ra->match_type - rb->match_type;
return ra->category - rb->category;

View File

@ -33,8 +33,28 @@ main (int argc, char **argv)
{
setlocale (LC_ALL, "");
if (argv[1] == NULL)
;
if (argv[1] == NULL || g_str_equal (argv[1], "--help"))
g_print ("Usage:\n"
" apps --help\n"
" apps COMMAND [COMMAND_OPTIONS]\n"
"\n"
"COMMANDS:\n"
" list\n"
" search [--should-show-only] TEXT_TO_SEARCH\n"
" implementations INTERFACE_NAME\n"
" show-info DESKTOP_FILE\n"
" default-for-type MIME_TYPE\n"
" recommended-for-type MIME_TYPE\n"
" all-for-type MIME_TYPE\n"
" fallback-for-type MIME_TYPE\n"
" should-show DESKTOP_FILE\n"
" monitor\n"
"\n"
"Examples:\n"
" apps search --should-show-only ter\n"
" apps show-info org.gnome.Nautilus.desktop\n"
" apps default-for-type image/png\n"
"\n");
else if (g_str_equal (argv[1], "list"))
{
GList *all, *i;
@ -47,13 +67,31 @@ main (int argc, char **argv)
else if (g_str_equal (argv[1], "search"))
{
gchar ***results;
gboolean should_show_only;
gint i, j;
results = g_desktop_app_info_search (argv[2]);
should_show_only = argc > 3 && g_str_equal (argv[2], "--should-show-only");
results = g_desktop_app_info_search (argv[ should_show_only ? 3 : 2 ]);
for (i = 0; results[i]; i++)
{
for (j = 0; results[i][j]; j++)
g_print ("%s%s", j ? " " : "", results[i][j]);
{
if (should_show_only)
{
GDesktopAppInfo *info;
gboolean should_show;
info = g_desktop_app_info_new (results[i][j]);
if (info)
{
should_show = g_app_info_should_show (G_APP_INFO (info));
g_object_unref (info);
if (!should_show)
continue;
}
}
g_print ("%s%s", j ? " " : "", results[i][j]);
}
g_print ("\n");
g_strfreev (results[i]);
}

View File

@ -888,11 +888,12 @@ test_search (void)
"gedit.desktop\n", TRUE, TRUE, NULL, NULL);
/* "con" will match "connect" and "contacts" on name with prefix match in
* first group, then match "Dconf Editor" and "Desktop Icons" with substring
* match in next group.
* first group, then second group is a Keyword prefix match for "configuration" in dconf-editor.desktop
* and third group is a substring match for "Desktop Icons" in Name of nautilus-classic.desktop.
*/
assert_search ("con", "gnome-contacts.desktop nautilus-connect-server.desktop\n"
"dconf-editor.desktop nautilus-classic.desktop\n", TRUE, TRUE, NULL, NULL);
"dconf-editor.desktop\n"
"nautilus-classic.desktop\n", TRUE, TRUE, NULL, NULL);
/* "gnome" will match "eye of gnome" from the user's directory, plus
* matching "GNOME Clocks" X-GNOME-FullName. It's only a comment on