diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 1f161328a..f724ec9fc 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -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; diff --git a/gio/tests/apps.c b/gio/tests/apps.c index 191edd4aa..d656b6c92 100644 --- a/gio/tests/apps.c +++ b/gio/tests/apps.c @@ -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]); } diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c index 594ec945d..6b4580893 100644 --- a/gio/tests/desktop-app-info.c +++ b/gio/tests/desktop-app-info.c @@ -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