[Xfce4-commits] [xfce/xfce4-appfinder] 01/01: Add fuzzy search matching (Bug #10393)
noreply at xfce.org
noreply at xfce.org
Wed Nov 23 23:18:58 CET 2016
This is an automated email from the git hooks/post-receive script.
ochosi pushed a commit to branch master
in repository xfce/xfce4-appfinder.
commit 486a9ae055d3e4b8baf5c5648587b42535365185
Author: Barkov Vadim <neverscaired at gmail.com>
Date: Tue Nov 22 20:40:26 2016 +0100
Add fuzzy search matching (Bug #10393)
---
src/appfinder-model.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++---
src/appfinder-window.c | 10 ++++-----
2 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/src/appfinder-model.c b/src/appfinder-model.c
index 355c2eb..be9c9eb 100644
--- a/src/appfinder-model.c
+++ b/src/appfinder-model.c
@@ -101,6 +101,8 @@ static void xfce_appfinder_model_bookmarks_monitor_stop (XfceAppfi
static void xfce_appfinder_model_bookmarks_monitor (XfceAppfinderModel *model,
const gchar *path);
+static gboolean xfce_appfinder_model_fuzzy_match (const gchar *source,
+ const gchar *token);
struct _XfceAppfinderModelClass
@@ -2020,7 +2022,7 @@ xfce_appfinder_model_get_visible (XfceAppfinderModel *model,
if (string != NULL
&& item->key != NULL)
- return strstr (item->key, string) != NULL;
+ return xfce_appfinder_model_fuzzy_match (item->key, string);
}
else /* command item */
{
@@ -2030,7 +2032,7 @@ xfce_appfinder_model_get_visible (XfceAppfinderModel *model,
return FALSE;
if (string != NULL)
- return strstr (item->command, string) != NULL;
+ return xfce_appfinder_model_fuzzy_match (item->command, string);
}
return TRUE;
@@ -2059,7 +2061,7 @@ xfce_appfinder_model_get_visible_command (XfceAppfinderModel *model,
}
if (item->command != NULL && string != NULL)
- return strncmp (item->command, string, strlen (string)) == 0;
+ return xfce_appfinder_model_fuzzy_match (item->command, string);
return FALSE;
}
@@ -2549,3 +2551,53 @@ xfce_appfinder_model_get_bookmarks_category (void)
return category;
}
+
+
+
+gboolean
+xfce_appfinder_model_fuzzy_match (const gchar *source,
+ const gchar *token)
+{
+ const guint token_size = strlen (token);
+ const guint cmd_part_size = token_size + 1;
+ guint index;
+ gboolean match = FALSE;
+ gboolean contain_uppercase = FALSE;
+
+ // length is chosen because of ".*<part1> *.*(?i)<part2>.*" pattern format
+ // "(?i)" is optional part
+ gchar pattern [token_size + 14];
+ gchar cmd_part [cmd_part_size];
+ gchar *param_part;
+
+ if (strcmp (token,"") == 0)
+ return TRUE;
+
+ for (index=1; !match && (index <= token_size); index++)
+ {
+ memset (cmd_part, 0, cmd_part_size);
+ strncpy (cmd_part, token, index);
+ cmd_part [index + 1] = '\0';
+
+ contain_uppercase = FALSE;
+ param_part = (gchar*) token + index;
+
+ while (!contain_uppercase && (*param_part != '\0'))
+ {
+ contain_uppercase = g_ascii_isupper (*param_part);
+ param_part++;
+ }
+
+ memset (pattern, 0, sizeof (pattern));
+ g_sprintf (pattern, ".*%s *.*%s%s.*", cmd_part,
+ (contain_uppercase) ? "(?-i)" : "(?i)",
+ token + index);
+ match = g_regex_match_simple (pattern, source, 0, 0);
+ if (match)
+ {
+ APPFINDER_DEBUG ("Fuzzy match: regexp=%s ; source=%s", pattern, source);
+ }
+ }
+
+ return match;
+}
diff --git a/src/appfinder-window.c b/src/appfinder-window.c
index 64603f4..11c10d2 100644
--- a/src/appfinder-window.c
+++ b/src/appfinder-window.c
@@ -112,8 +112,6 @@ static void xfce_appfinder_window_launch_clicked (XfceAppfi
static void xfce_appfinder_window_execute (XfceAppfinderWindow *window,
gboolean close_on_succeed);
-
-
struct _XfceAppfinderWindowClass
{
GtkWindowClass __parent__;
@@ -294,7 +292,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
gtk_entry_completion_set_match_func (completion, xfce_appfinder_window_completion_match_func, window, NULL);
gtk_entry_completion_set_text_column (completion, XFCE_APPFINDER_MODEL_COLUMN_COMMAND);
gtk_entry_completion_set_popup_completion (completion, TRUE);
- gtk_entry_completion_set_popup_single_match (completion, FALSE);
+ gtk_entry_completion_set_popup_single_match (completion, TRUE);
gtk_entry_completion_set_inline_completion (completion, TRUE);
window->bin_collapsed = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
@@ -571,7 +569,7 @@ xfce_appfinder_window_window_state_event (GtkWidget *widget,
static void
xfce_appfinder_window_set_item_width (XfceAppfinderWindow *window)
{
- gint width;
+ gint width = 0;
XfceAppfinderIconSize icon_size;
GtkOrientation item_orientation = GTK_ORIENTATION_VERTICAL;
GList *renderers;
@@ -1555,10 +1553,12 @@ xfce_appfinder_window_item_visible (GtkTreeModel *model,
gpointer data)
{
XfceAppfinderWindow *window = XFCE_APPFINDER_WINDOW (data);
+ /* don't use the casefolded key generated by gtk */
+ const gchar *filter_string= gtk_entry_get_text (GTK_ENTRY (window->entry));
return xfce_appfinder_model_get_visible (XFCE_APPFINDER_MODEL (model), iter,
window->filter_category,
- window->filter_text);
+ filter_string);
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list