Differentiate hash table/ frozen and manual/ normal completion
Adding and looking up items based on a hash table is incredibly fast, so it's vital for startup, however at runtime we want to prepend which invalidates the contents of the hash table. So now we use the hash based lookup only for frozen operation, which is used at startup and has to be fast, but manual string comparisons are used at runtime.
This commit is contained in:
parent
ca4d5cb520
commit
75c83f1224
1 changed files with 84 additions and 29 deletions
|
@ -233,6 +233,9 @@ midori_location_action_freeze (MidoriLocationAction* location_action)
|
||||||
katze_object_assign (location_action->sort_model, NULL);
|
katze_object_assign (location_action->sort_model, NULL);
|
||||||
katze_object_assign (location_action->filter_model, NULL);
|
katze_object_assign (location_action->filter_model, NULL);
|
||||||
midori_location_action_set_model (location_action, NULL);
|
midori_location_action_set_model (location_action, NULL);
|
||||||
|
|
||||||
|
if (location_action->items)
|
||||||
|
g_hash_table_remove_all (location_action->items);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -248,6 +251,9 @@ midori_location_action_thaw (MidoriLocationAction* location_action)
|
||||||
{
|
{
|
||||||
GtkTreeModel* sort_model;
|
GtkTreeModel* sort_model;
|
||||||
GtkTreeModel* filter_model;
|
GtkTreeModel* filter_model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeIter child_iter;
|
||||||
|
gint i;
|
||||||
|
|
||||||
g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action));
|
g_return_if_fail (MIDORI_IS_LOCATION_ACTION (location_action));
|
||||||
g_return_if_fail (midori_location_action_is_frozen (location_action));
|
g_return_if_fail (midori_location_action_is_frozen (location_action));
|
||||||
|
@ -263,6 +269,15 @@ midori_location_action_thaw (MidoriLocationAction* location_action)
|
||||||
|
|
||||||
location_action->filter_model = filter_model;
|
location_action->filter_model = filter_model;
|
||||||
location_action->sort_model = sort_model;
|
location_action->sort_model = sort_model;
|
||||||
|
|
||||||
|
i = MAX_ITEMS;
|
||||||
|
while (gtk_tree_model_iter_nth_child (sort_model, &iter, NULL, i++))
|
||||||
|
{
|
||||||
|
gtk_tree_model_sort_convert_iter_to_child_iter (
|
||||||
|
GTK_TREE_MODEL_SORT (sort_model), &child_iter, &iter);
|
||||||
|
gtk_list_store_set (GTK_LIST_STORE (location_action->model),
|
||||||
|
&child_iter, VISIBLE_COL, FALSE, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -575,6 +590,20 @@ midori_location_action_set_item (MidoriLocationAction* location_action,
|
||||||
FAVICON_COL, new_icon, -1);
|
FAVICON_COL, new_icon, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gchar*
|
||||||
|
midori_location_action_format_uri (const gchar* uri)
|
||||||
|
{
|
||||||
|
gchar* new_uri;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
new_uri = g_ascii_strdown (uri, -1);
|
||||||
|
len = strlen (new_uri);
|
||||||
|
|
||||||
|
if (new_uri [len - 1] == '/')
|
||||||
|
new_uri [len - 1] = '\0';
|
||||||
|
return new_uri;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* midori_location_action_iter_lookup:
|
* midori_location_action_iter_lookup:
|
||||||
* @location_action: a #MidoriLocationAction
|
* @location_action: a #MidoriLocationAction
|
||||||
|
@ -591,24 +620,43 @@ midori_location_action_iter_lookup (MidoriLocationAction* location_action,
|
||||||
const gchar* uri,
|
const gchar* uri,
|
||||||
GtkTreeIter* iter)
|
GtkTreeIter* iter)
|
||||||
{
|
{
|
||||||
|
GtkTreeModel* model;
|
||||||
gchar* path;
|
gchar* path;
|
||||||
gchar* new_uri;
|
gchar* new_uri;
|
||||||
|
gchar* tmp_uri;
|
||||||
gboolean found;
|
gboolean found;
|
||||||
|
|
||||||
|
model = location_action->model;
|
||||||
found = FALSE;
|
found = FALSE;
|
||||||
new_uri = NULL;
|
|
||||||
|
|
||||||
if (!g_str_has_suffix (uri, "/"))
|
new_uri = midori_location_action_format_uri (uri);
|
||||||
new_uri = g_strconcat (uri, "/", NULL);
|
|
||||||
|
|
||||||
if ((path = g_hash_table_lookup (location_action->items,
|
if (midori_location_action_is_frozen (location_action))
|
||||||
new_uri ? new_uri : uri)))
|
|
||||||
{
|
{
|
||||||
if (!(found = gtk_tree_model_get_iter_from_string (location_action->model,
|
if ((path = g_hash_table_lookup (location_action->items, new_uri)))
|
||||||
iter, path)))
|
|
||||||
{
|
{
|
||||||
g_hash_table_remove (location_action->items,
|
if (!(found = gtk_tree_model_get_iter_from_string (model, iter, path)))
|
||||||
new_uri ? new_uri : uri);
|
{
|
||||||
|
g_hash_table_remove (location_action->items, new_uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (gtk_tree_model_get_iter_first (model, iter))
|
||||||
|
{
|
||||||
|
tmp_uri = NULL;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
gtk_tree_model_get (model, iter, URI_COL, &tmp_uri, -1);
|
||||||
|
found = !g_ascii_strncasecmp (new_uri, tmp_uri, strlen (new_uri));
|
||||||
|
katze_assign (tmp_uri, NULL);
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (gtk_tree_model_iter_next (model, iter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_free (new_uri);
|
g_free (new_uri);
|
||||||
|
@ -638,16 +686,16 @@ midori_location_action_iter_insert (MidoriLocationAction* location_action,
|
||||||
{
|
{
|
||||||
GtkTreeModel* model;
|
GtkTreeModel* model;
|
||||||
gchar* path;
|
gchar* path;
|
||||||
|
gchar* new_uri;
|
||||||
|
|
||||||
model = location_action->model;
|
model = location_action->model;
|
||||||
gtk_list_store_insert (GTK_LIST_STORE (model), iter, position);
|
gtk_list_store_insert (GTK_LIST_STORE (model), iter, position);
|
||||||
|
if (midori_location_action_is_frozen (location_action))
|
||||||
|
{
|
||||||
|
new_uri = midori_location_action_format_uri (uri);
|
||||||
path = gtk_tree_model_get_string_from_iter (model, iter);
|
path = gtk_tree_model_get_string_from_iter (model, iter);
|
||||||
g_hash_table_insert (location_action->items,
|
g_hash_table_insert (location_action->items, new_uri, path);
|
||||||
g_str_has_suffix (uri, "/") ?
|
}
|
||||||
g_strdup (uri) :
|
|
||||||
g_strconcat (uri, "/", NULL),
|
|
||||||
path);
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -907,13 +955,16 @@ midori_location_action_prepend_item (MidoriLocationAction* location_action,
|
||||||
MidoriLocationEntryItem* item)
|
MidoriLocationEntryItem* item)
|
||||||
{
|
{
|
||||||
GtkTreeModel* filter_model;
|
GtkTreeModel* filter_model;
|
||||||
|
GtkTreeModel* sort_model;
|
||||||
GtkTreeModel* model;
|
GtkTreeModel* model;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
GtkTreeIter sort_iter;
|
||||||
GtkTreeIter idx;
|
GtkTreeIter idx;
|
||||||
gint n;
|
gint n;
|
||||||
gint visits = 0;
|
gint visits = 0;
|
||||||
|
|
||||||
filter_model = location_action->filter_model;
|
filter_model = location_action->filter_model;
|
||||||
|
sort_model = location_action->sort_model;
|
||||||
model = location_action->model;
|
model = location_action->model;
|
||||||
|
|
||||||
if (midori_location_action_iter_insert (location_action,
|
if (midori_location_action_iter_insert (location_action,
|
||||||
|
@ -924,18 +975,25 @@ midori_location_action_prepend_item (MidoriLocationAction* location_action,
|
||||||
gtk_list_store_move_before (GTK_LIST_STORE (model), &iter, &idx);
|
gtk_list_store_move_before (GTK_LIST_STORE (model), &iter, &idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
n = gtk_tree_model_iter_n_children (filter_model, NULL);
|
|
||||||
if (n > MAX_ITEMS)
|
|
||||||
{
|
|
||||||
gtk_tree_model_iter_nth_child (model, &idx, NULL, n - 1);
|
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model),
|
|
||||||
&idx, VISIBLE_COL, FALSE, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Only increment the visits when we add the uri */
|
/* Only increment the visits when we add the uri */
|
||||||
if (!item->title && !item->favicon)
|
if (!item->title && !item->favicon)
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, VISITS_COL, ++visits,
|
gtk_list_store_set (GTK_LIST_STORE (model), &iter, VISITS_COL, ++visits,
|
||||||
VISIBLE_COL, TRUE, -1);
|
VISIBLE_COL, TRUE, -1);
|
||||||
|
|
||||||
|
if (filter_model)
|
||||||
|
{
|
||||||
|
n = gtk_tree_model_iter_n_children (filter_model, NULL);
|
||||||
|
if (n > MAX_ITEMS)
|
||||||
|
{
|
||||||
|
gtk_tree_model_iter_nth_child (filter_model, &idx, NULL, n - 1);
|
||||||
|
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (filter_model),
|
||||||
|
&sort_iter, &idx);
|
||||||
|
gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (sort_model),
|
||||||
|
&idx, &sort_iter);
|
||||||
|
gtk_list_store_set (GTK_LIST_STORE (model),
|
||||||
|
&idx, VISIBLE_COL, FALSE, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
midori_location_action_set_item (location_action, &iter, item);
|
midori_location_action_set_item (location_action, &iter, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -953,19 +1011,16 @@ midori_location_action_append_item (MidoriLocationAction* location_action,
|
||||||
{
|
{
|
||||||
GtkTreeModel* model;
|
GtkTreeModel* model;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
gint n;
|
|
||||||
gint visits = 0;
|
gint visits = 0;
|
||||||
|
|
||||||
model = location_action->model;
|
model = location_action->model;
|
||||||
|
|
||||||
if (!midori_location_action_iter_insert (location_action,
|
if (midori_location_action_iter_insert (location_action,
|
||||||
item->uri, &iter, G_MAXINT))
|
item->uri, &iter, G_MAXINT))
|
||||||
n = gtk_tree_model_iter_n_children (model, NULL);
|
|
||||||
else
|
|
||||||
gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1);
|
gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1);
|
||||||
|
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
|
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
|
||||||
VISITS_COL, ++visits, VISIBLE_COL, n <= MAX_ITEMS, -1);
|
VISITS_COL, ++visits, VISIBLE_COL, TRUE, -1);
|
||||||
midori_location_action_set_item (location_action, &iter, item);
|
midori_location_action_set_item (location_action, &iter, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue