summaryrefslogtreecommitdiff
path: root/gtk/gtkrecentmanager.c
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2019-08-30 08:26:25 +0200
committerTimm Bäder <mail@baedert.org>2019-09-09 17:36:26 +0200
commit4413592a700efd0973880b6a9641f7d91b41828b (patch)
tree0a14721634fb4d54d6f2157dcf1af22c4214bdaf /gtk/gtkrecentmanager.c
parent4c28ee80a622867e83c7540bb354b89b39049aef (diff)
downloadgtk+-4413592a700efd0973880b6a9641f7d91b41828b.tar.gz
recentmanager: Stop using linked lists
It doesn't really make sense to save the applications and groups in recent infos as linked lists. We get them from glib as arrays, so we can as well just save them as such.
Diffstat (limited to 'gtk/gtkrecentmanager.c')
-rw-r--r--gtk/gtkrecentmanager.c118
1 files changed, 46 insertions, 72 deletions
diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c
index a1d27f701e..c4238d079a 100644
--- a/gtk/gtkrecentmanager.c
+++ b/gtk/gtkrecentmanager.c
@@ -150,10 +150,12 @@ struct _GtkRecentInfo
gchar *mime_type;
- GSList *applications;
+ RecentAppInfo *applications;
+ int n_applications;
GHashTable *apps_lookup;
- GSList *groups;
+ char **groups;
+ int n_groups;
gboolean is_private;
@@ -219,9 +221,6 @@ static void build_recent_items_list (GtkRecentManager *manag
static void purge_recent_items_list (GtkRecentManager *manager,
GError **error);
-static RecentAppInfo *recent_app_info_new (const gchar *app_name);
-static void recent_app_info_free (RecentAppInfo *app_info);
-
static GtkRecentInfo *gtk_recent_info_new (const gchar *uri);
static void gtk_recent_info_free (GtkRecentInfo *recent_info);
@@ -1086,6 +1085,7 @@ build_recent_info (GBookmarkFile *bookmarks,
{
gchar **apps, **groups;
gsize apps_len, groups_len, i;
+ int app_index;
g_assert (bookmarks != NULL);
g_assert (info != NULL);
@@ -1101,16 +1101,17 @@ build_recent_info (GBookmarkFile *bookmarks,
info->visited = g_bookmark_file_get_visited (bookmarks, info->uri, NULL);
groups = g_bookmark_file_get_groups (bookmarks, info->uri, &groups_len, NULL);
+ info->groups = g_malloc (sizeof (char *) * groups_len);
+ info->n_groups = groups_len;
for (i = 0; i < groups_len; i++)
- {
- gchar *group_name = g_strdup (groups[i]);
-
- info->groups = g_slist_append (info->groups, group_name);
- }
+ info->groups[i] = g_strdup (groups[i]);
g_strfreev (groups);
+ app_index = 0;
apps = g_bookmark_file_get_applications (bookmarks, info->uri, &apps_len, NULL);
+ info->applications = g_malloc (sizeof (RecentAppInfo ) * apps_len);
+ info->n_applications = 0;
for (i = 0; i < apps_len; i++)
{
gchar *app_name, *app_exec;
@@ -1129,13 +1130,16 @@ build_recent_info (GBookmarkFile *bookmarks,
if (!res)
continue;
- app_info = recent_app_info_new (app_name);
+ app_info = &info->applications[app_index];
+ app_info->name= g_strdup (app_name);
app_info->exec = app_exec;
app_info->count = count;
app_info->stamp = stamp;
- info->applications = g_slist_prepend (info->applications, app_info);
g_hash_table_replace (info->apps_lookup, app_info->name, app_info);
+
+ app_index ++;
+ info->n_applications ++;
}
g_strfreev (apps);
@@ -1496,6 +1500,8 @@ gtk_recent_info_new (const gchar *uri)
static void
gtk_recent_info_free (GtkRecentInfo *recent_info)
{
+ int i;
+
if (!recent_info)
return;
@@ -1504,12 +1510,22 @@ gtk_recent_info_free (GtkRecentInfo *recent_info)
g_free (recent_info->description);
g_free (recent_info->mime_type);
- g_slist_free_full (recent_info->applications, (GDestroyNotify)recent_app_info_free);
+ for (i = 0; i < recent_info->n_applications; i ++)
+ {
+ const RecentAppInfo *app_info = &recent_info->applications[i];
+
+ g_free (app_info->name);
+ g_free (app_info->exec);
+ }
+ g_free (recent_info->applications);
if (recent_info->apps_lookup)
g_hash_table_destroy (recent_info->apps_lookup);
- g_slist_free_full (recent_info->groups, g_free);
+ for (i = 0; i < recent_info->n_groups; i ++)
+ g_free (recent_info->groups[i]);
+
+ g_free (recent_info->groups);
g_free (recent_info);
}
@@ -1700,35 +1716,6 @@ gtk_recent_info_get_private_hint (GtkRecentInfo *info)
return info->is_private;
}
-
-static RecentAppInfo *
-recent_app_info_new (const gchar *app_name)
-{
- RecentAppInfo *app_info;
-
- g_assert (app_name != NULL);
-
- app_info = g_slice_new0 (RecentAppInfo);
- app_info->name = g_strdup (app_name);
- app_info->exec = NULL;
- app_info->count = 1;
- app_info->stamp = 0;
-
- return app_info;
-}
-
-static void
-recent_app_info_free (RecentAppInfo *app_info)
-{
- if (!app_info)
- return;
-
- g_free (app_info->name);
- g_free (app_info->exec);
-
- g_slice_free (RecentAppInfo, app_info);
-}
-
/**
* gtk_recent_info_get_application_info:
* @info: a #GtkRecentInfo
@@ -1800,7 +1787,6 @@ gchar **
gtk_recent_info_get_applications (GtkRecentInfo *info,
gsize *length)
{
- GSList *l;
gchar **retval;
gsize n_apps, i;
@@ -1814,24 +1800,20 @@ gtk_recent_info_get_applications (GtkRecentInfo *info,
return NULL;
}
- n_apps = g_slist_length (info->applications);
+ n_apps = info->n_applications;
retval = g_new0 (gchar *, n_apps + 1);
- for (l = info->applications, i = 0;
- l != NULL;
- l = l->next)
+ for (i = 0; i < info->n_applications; i ++)
{
- RecentAppInfo *ai = (RecentAppInfo *) l->data;
+ const RecentAppInfo *ai = &info->applications[i];
- g_assert (ai != NULL);
-
- retval[i++] = g_strdup (ai->name);
+ retval[i] = g_strdup (ai->name);
}
retval[i] = NULL;
if (length)
- *length = i;
+ *length = info->n_applications;
return retval;
}
@@ -1868,15 +1850,15 @@ gtk_recent_info_has_application (GtkRecentInfo *info,
gchar *
gtk_recent_info_last_application (GtkRecentInfo *info)
{
- GSList *l;
+ int i;
time_t last_stamp = (time_t) -1;
gchar *name = NULL;
g_return_val_if_fail (info != NULL, NULL);
- for (l = info->applications; l != NULL; l = l->next)
+ for (i = 0; i < info->n_applications; i ++)
{
- RecentAppInfo *ai = (RecentAppInfo *) l->data;
+ const RecentAppInfo *ai = &info->applications[i];
if (ai->stamp > last_stamp)
{
@@ -2229,13 +2211,12 @@ gchar **
gtk_recent_info_get_groups (GtkRecentInfo *info,
gsize *length)
{
- GSList *l;
gchar **retval;
gsize n_groups, i;
g_return_val_if_fail (info != NULL, NULL);
- if (!info->groups)
+ if (!info->groups || info->n_groups == 0)
{
if (length)
*length = 0;
@@ -2243,24 +2224,17 @@ gtk_recent_info_get_groups (GtkRecentInfo *info,
return NULL;
}
- n_groups = g_slist_length (info->groups);
+ n_groups = info->n_groups;
retval = g_new0 (gchar *, n_groups + 1);
- for (l = info->groups, i = 0;
- l != NULL;
- l = l->next)
- {
- gchar *group_name = (gchar *) l->data;
-
- g_assert (group_name != NULL);
+ for (i = 0; i < info->n_groups; i ++)
+ retval[i] = g_strdup (info->groups[i]);
- retval[i++] = g_strdup (group_name);
- }
retval[i] = NULL;
if (length)
- *length = i;
+ *length = info->n_groups;
return retval;
}
@@ -2279,7 +2253,7 @@ gboolean
gtk_recent_info_has_group (GtkRecentInfo *info,
const gchar *group_name)
{
- GSList *l;
+ int i;
g_return_val_if_fail (info != NULL, FALSE);
g_return_val_if_fail (group_name != NULL, FALSE);
@@ -2287,9 +2261,9 @@ gtk_recent_info_has_group (GtkRecentInfo *info,
if (!info->groups)
return FALSE;
- for (l = info->groups; l != NULL; l = l->next)
+ for (i = 0; i < info->n_groups; i ++)
{
- gchar *g = (gchar *) l->data;
+ const char *g = info->groups[i];
if (strcmp (g, group_name) == 0)
return TRUE;