[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