From 9a78cc6f6e2e55b76cf9cd41af58e84e0694cb86 Mon Sep 17 00:00:00 2001 From: Peter de Ridder Date: Sun, 15 Aug 2010 23:44:13 +0200 Subject: [PATCH] Support space and percent as wild cards in location completion Internally the typed key is treated as if spaces are wildcards, so 'hello world' would be 'hello%world'. The text renderer splits the typed text by ' ' and '%', so multiple words are highlighted. --- midori/midori-locationaction.c | 145 +++++++++++++++++++++++++++------ 1 file changed, 122 insertions(+), 23 deletions(-) diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c index 5b77ac58..2e583f1a 100644 --- a/midori/midori-locationaction.c +++ b/midori/midori-locationaction.c @@ -336,6 +336,8 @@ midori_location_action_popup_timeout_cb (gpointer data) MidoriLocationAction* action = data; GtkTreeViewColumn* column; GtkListStore* store; + gchar* effective_key; + gint i; gint result; static sqlite3_stmt* stmt; const gchar* sqlcmd; @@ -369,7 +371,16 @@ midori_location_action_popup_timeout_cb (gpointer data) ") GROUP BY uri ORDER BY ct DESC LIMIT ?2"; sqlite3_prepare_v2 (db, sqlcmd, strlen (sqlcmd) + 1, &stmt, NULL); } - sqlite3_bind_text (stmt, 1, g_strdup_printf ("%%%s%%", action->key), -1, g_free); + effective_key = g_strdup_printf ("%%%s%%", action->key); + i = 0; + do + { + if (effective_key[i] == ' ') + effective_key[i] = '%'; + i++; + } + while (effective_key[i] != '\0'); + sqlite3_bind_text (stmt, 1, effective_key, -1, g_free); sqlite3_bind_int64 (stmt, 2, MAX_ITEMS); result = sqlite3_step (stmt); @@ -1019,14 +1030,21 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout, gboolean style; gchar* desc; gchar* desc_uri; + gchar* desc_iter; + gchar* temp_iter; gchar* desc_title; const gchar* str; gchar* key; + gchar** keys; + gint key_idx; gchar* start; gchar* skey; gchar* temp; + gchar* temp_concat; + gchar* temp_markup; gchar** parts; size_t len; + size_t offset; gtk_tree_model_get (model, iter, URI_COL, &uri, TITLE_COL, &title, BACKGROUND_COL, &background, STYLE_COL, &style, -1); @@ -1047,40 +1065,121 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout, str = ""; key = g_utf8_strdown (str, -1); - len = strlen (key); + keys = g_strsplit_set (key, " %", -1); + g_free (key); if (G_LIKELY (uri)) { - temp = g_utf8_strdown (uri, -1); - if ((start = strstr (temp, key)) && (start - temp)) + temp_iter = temp = g_utf8_strdown (uri, -1); + desc_iter = uri; + key_idx = 0; + key = keys[key_idx]; + len = strlen (key); + offset = 0; + while ((start = strstr (temp_iter, key)) && start) + { + if (len) + { + offset = (start - temp_iter); + skey = g_strndup (desc_iter + offset, len); + parts = g_strsplit (desc_iter, skey, 2); + if (parts[0] && parts[1]) + { + if (desc_uri) + { + temp_markup = g_markup_printf_escaped ("%s%s", + parts[0], skey); + temp_concat = g_strconcat (desc_uri, temp_markup, NULL); + g_free (temp_markup); + katze_assign (desc_uri, temp_concat); + } + else + { + desc_uri = g_markup_printf_escaped ("%s%s", + parts[0], skey); + } + } + g_strfreev (parts); + g_free (skey); + + offset += len; + temp_iter += offset; + desc_iter += offset; + } + key_idx++; + key = keys[key_idx]; + if (key == NULL) + break; + len = strlen (key); + } + if (key) + katze_assign (desc_uri, NULL); + if (desc_uri) { - skey = g_strndup (uri + (start - temp), len); - parts = g_strsplit (uri, skey, 2); - if (parts[0] && parts[1]) - desc_uri = g_markup_printf_escaped ("%s%s%s", - parts[0], skey, parts[1]); - g_strfreev (parts); - g_free (skey); + temp_markup = g_markup_escape_text (desc_iter, -1); + temp_concat = g_strconcat (desc_uri, temp_markup, NULL); + g_free (temp_markup); + katze_assign (desc_uri, temp_concat); } - if (!desc_uri) + else desc_uri = g_markup_escape_text (uri, -1); g_free (temp); } if (G_LIKELY (title)) { - temp = g_utf8_strdown (title, -1); - if ((start = strstr (temp, key)) && (start - temp)) + temp_iter = temp = g_utf8_strdown (title, -1); + desc_iter = title; + key_idx = 0; + key = keys[key_idx]; + len = strlen (key); + offset = 0; + while ((start = strstr (temp_iter, key)) && start) { - skey = g_strndup (title + (start - temp), len); - parts = g_strsplit (title, skey, 2); - if (parts[0] && parts[1]) - desc_title = g_markup_printf_escaped ("%s%s%s", - parts[0], skey, parts[1]); - g_strfreev (parts); - g_free (skey); + if (len) + { + offset = (start - temp_iter); + skey = g_strndup (desc_iter + offset, len); + parts = g_strsplit (desc_iter, skey, 2); + if (parts[0] && parts[1]) + { + if (desc_title) + { + temp_markup = g_markup_printf_escaped ("%s%s", + parts[0], skey); + temp_concat = g_strconcat (desc_title, temp_markup, NULL); + g_free (temp_markup); + katze_assign (desc_title, temp_concat); + } + else + { + desc_title = g_markup_printf_escaped ("%s%s", + parts[0], skey); + } + } + g_strfreev (parts); + g_free (skey); + + offset += len; + temp_iter += offset; + desc_iter += offset; + } + key_idx++; + key = keys[key_idx]; + if (key == NULL) + break; + len = strlen (key); } - if (!desc_title) + if (key) + katze_assign (desc_title, NULL); + if (desc_title) + { + temp_markup = g_markup_escape_text (desc_iter, -1); + temp_concat = g_strconcat (desc_title, temp_markup, NULL); + g_free (temp_markup); + katze_assign (desc_title, temp_concat); + } + else desc_title = g_markup_escape_text (title, -1); g_free (temp); } @@ -1100,7 +1199,7 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout, g_free (uri); g_free (title); - g_free (key); + g_strfreev (keys); g_free (desc); } -- 2.39.5