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->filter_model, 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* filter_model;
|
||||
GtkTreeIter iter;
|
||||
GtkTreeIter child_iter;
|
||||
gint i;
|
||||
|
||||
g_return_if_fail (MIDORI_IS_LOCATION_ACTION (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->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
|
||||
|
@ -575,6 +590,20 @@ midori_location_action_set_item (MidoriLocationAction* location_action,
|
|||
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:
|
||||
* @location_action: a #MidoriLocationAction
|
||||
|
@ -591,24 +620,43 @@ midori_location_action_iter_lookup (MidoriLocationAction* location_action,
|
|||
const gchar* uri,
|
||||
GtkTreeIter* iter)
|
||||
{
|
||||
GtkTreeModel* model;
|
||||
gchar* path;
|
||||
gchar* new_uri;
|
||||
gchar* tmp_uri;
|
||||
gboolean found;
|
||||
|
||||
model = location_action->model;
|
||||
found = FALSE;
|
||||
new_uri = NULL;
|
||||
|
||||
if (!g_str_has_suffix (uri, "/"))
|
||||
new_uri = g_strconcat (uri, "/", NULL);
|
||||
new_uri = midori_location_action_format_uri (uri);
|
||||
|
||||
if ((path = g_hash_table_lookup (location_action->items,
|
||||
new_uri ? new_uri : uri)))
|
||||
if (midori_location_action_is_frozen (location_action))
|
||||
{
|
||||
if (!(found = gtk_tree_model_get_iter_from_string (location_action->model,
|
||||
iter, path)))
|
||||
if ((path = g_hash_table_lookup (location_action->items, new_uri)))
|
||||
{
|
||||
g_hash_table_remove (location_action->items,
|
||||
new_uri ? new_uri : uri);
|
||||
if (!(found = gtk_tree_model_get_iter_from_string (model, iter, path)))
|
||||
{
|
||||
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);
|
||||
|
@ -638,16 +686,16 @@ midori_location_action_iter_insert (MidoriLocationAction* location_action,
|
|||
{
|
||||
GtkTreeModel* model;
|
||||
gchar* path;
|
||||
gchar* new_uri;
|
||||
|
||||
model = location_action->model;
|
||||
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);
|
||||
g_hash_table_insert (location_action->items,
|
||||
g_str_has_suffix (uri, "/") ?
|
||||
g_strdup (uri) :
|
||||
g_strconcat (uri, "/", NULL),
|
||||
path);
|
||||
|
||||
g_hash_table_insert (location_action->items, new_uri, path);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -907,13 +955,16 @@ midori_location_action_prepend_item (MidoriLocationAction* location_action,
|
|||
MidoriLocationEntryItem* item)
|
||||
{
|
||||
GtkTreeModel* filter_model;
|
||||
GtkTreeModel* sort_model;
|
||||
GtkTreeModel* model;
|
||||
GtkTreeIter iter;
|
||||
GtkTreeIter sort_iter;
|
||||
GtkTreeIter idx;
|
||||
gint n;
|
||||
gint visits = 0;
|
||||
|
||||
filter_model = location_action->filter_model;
|
||||
sort_model = location_action->sort_model;
|
||||
model = location_action->model;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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 */
|
||||
if (!item->title && !item->favicon)
|
||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, VISITS_COL, ++visits,
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -953,19 +1011,16 @@ midori_location_action_append_item (MidoriLocationAction* location_action,
|
|||
{
|
||||
GtkTreeModel* model;
|
||||
GtkTreeIter iter;
|
||||
gint n;
|
||||
gint visits = 0;
|
||||
|
||||
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))
|
||||
n = gtk_tree_model_iter_n_children (model, NULL);
|
||||
else
|
||||
gtk_tree_model_get (model, &iter, VISITS_COL, &visits, -1);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue