app-system: Consider usage frequency in search results

Application search results are internally categorized in four sets,
multiple and single prefix matches and multiple and single substring
matches. Each set is currently sorted alphabetically by application
name when concatenating the sets to the final result.
Change the last step to sort each set by usage frequency instead,
which is more likely to favor the most relevant match than
"arbitrary" alphabetic order.

https://bugzilla.gnome.org/show_bug.cgi?id=623372
This commit is contained in:
Florian Müllner 2011-10-05 16:44:50 +02:00
parent 85520e34ab
commit da83ad561b
3 changed files with 54 additions and 8 deletions

View File

@ -3,6 +3,7 @@
#include "config.h" #include "config.h"
#include "shell-app-system.h" #include "shell-app-system.h"
#include "shell-app-usage.h"
#include <string.h> #include <string.h>
#include <gio/gio.h> #include <gio/gio.h>
@ -670,14 +671,16 @@ shell_app_system_get_running (ShellAppSystem *self)
static gint static gint
compare_apps_by_name (gconstpointer a, compare_apps_by_usage (gconstpointer a,
gconstpointer b, gconstpointer b,
gpointer data) gpointer data)
{ {
ShellAppUsage *usage = shell_app_usage_get_default ();
ShellApp *app_a = (ShellApp*)a; ShellApp *app_a = (ShellApp*)a;
ShellApp *app_b = (ShellApp*)b; ShellApp *app_b = (ShellApp*)b;
return shell_app_compare_by_name (app_a, app_b); return shell_app_usage_compare (usage, "", app_a, app_b);
} }
static GSList * static GSList *
@ -688,16 +691,16 @@ sort_and_concat_results (ShellAppSystem *system,
GSList *substring_matches) GSList *substring_matches)
{ {
multiple_prefix_matches = g_slist_sort_with_data (multiple_prefix_matches, multiple_prefix_matches = g_slist_sort_with_data (multiple_prefix_matches,
compare_apps_by_name, compare_apps_by_usage,
system); system);
prefix_matches = g_slist_sort_with_data (prefix_matches, prefix_matches = g_slist_sort_with_data (prefix_matches,
compare_apps_by_name, compare_apps_by_usage,
system); system);
multiple_substring_matches = g_slist_sort_with_data (multiple_substring_matches, multiple_substring_matches = g_slist_sort_with_data (multiple_substring_matches,
compare_apps_by_name, compare_apps_by_usage,
system); system);
substring_matches = g_slist_sort_with_data (substring_matches, substring_matches = g_slist_sort_with_data (substring_matches,
compare_apps_by_name, compare_apps_by_usage,
system); system);
return g_slist_concat (multiple_prefix_matches, g_slist_concat (prefix_matches, g_slist_concat (multiple_substring_matches, substring_matches))); return g_slist_concat (multiple_prefix_matches, g_slist_concat (prefix_matches, g_slist_concat (multiple_substring_matches, substring_matches)));
} }

View File

@ -528,6 +528,45 @@ shell_app_usage_get_most_used (ShellAppUsage *self,
return apps; return apps;
} }
/**
* shell_app_usage_compare:
* @self: the usage instance to request
* @context: Activity identifier
* @app_a: First app
* @app_b: Second app
*
* Compare @app_a and @app_b based on frequency of use.
*
* Returns: -1 if @app_a ranks higher than @app_b, 1 if @app_b ranks higher
* than @app_a, and 0 if both rank equally.
*/
int
shell_app_usage_compare (ShellAppUsage *self,
const char *context,
ShellApp *app_a,
ShellApp *app_b)
{
GHashTable *usages;
UsageData *usage_a, *usage_b;
usages = g_hash_table_lookup (self->app_usages_for_context, context);
if (usages == NULL)
return 0;
usage_a = g_hash_table_lookup (usages, shell_app_get_id (app_a));
usage_b = g_hash_table_lookup (usages, shell_app_get_id (app_b));
if (usage_a == NULL && usage_b == NULL)
return 0;
else if (usage_a == NULL)
return 1;
else if (usage_b == NULL)
return -1;
return usage_b->score - usage_a->score;
}
static void static void
ensure_queued_save (ShellAppUsage *self) ensure_queued_save (ShellAppUsage *self)
{ {

View File

@ -30,6 +30,10 @@ ShellAppUsage* shell_app_usage_get_default(void);
GSList *shell_app_usage_get_most_used (ShellAppUsage *usage, GSList *shell_app_usage_get_most_used (ShellAppUsage *usage,
const char *context, const char *context,
gint max_count); gint max_count);
int shell_app_usage_compare (ShellAppUsage *self,
const char *context,
ShellApp *app_a,
ShellApp *app_b);
G_END_DECLS G_END_DECLS