[gtk/wip/baedert/icontheme: 814/821] icontheme: Stop using GPtrArrays in choose_icon
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/icontheme: 814/821] icontheme: Stop using GPtrArrays in choose_icon
- Date: Sun, 21 Jul 2019 08:40:25 +0000 (UTC)
commit 7edc230c5ae12b79728c9467989a60fc805f41ee
Author: Timm Bäder <mail baedert org>
Date: Sat May 25 17:39:44 2019 +0200
icontheme: Stop using GPtrArrays in choose_icon
We actually know the exact amount of new icon names we will have before.
gtk/gtkicontheme.c | 104 ++++++++++++++++++++++++++++++++---------------------
1 file changed, 64 insertions(+), 40 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 3f24570a9f..8da0f34b43 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -1890,13 +1890,14 @@ real_choose_icon (GtkIconTheme *icon_theme,
}
static void
-icon_name_list_add_icon (GPtrArray *icons,
- const gchar *dir_suffix,
- gchar *icon_name)
+icon_name_list_add_icon (char **icon_names,
+ const char *dir_suffix,
+ char *icon_name,
+ int *iterator)
{
if (dir_suffix)
- g_ptr_array_add (icons, g_strconcat (icon_name, dir_suffix, NULL));
- g_ptr_array_add (icons, icon_name);
+ icon_names[(*iterator)++] = g_strconcat (icon_name, dir_suffix, NULL);
+ icon_names[(*iterator)++] = icon_name;
}
static GtkIconInfo *
@@ -1906,12 +1907,15 @@ choose_icon (GtkIconTheme *icon_theme,
gint scale,
GtkIconLookupFlags flags)
{
- gboolean has_regular = FALSE, has_symbolic = FALSE;
GtkIconInfo *icon_info;
- GPtrArray *new_names;
const gchar *dir_suffix;
+ char **new_names = NULL;
+ int n_new_names = 0;
guint i;
int n_icon_names = 0;
+ int n_symbolic_icon_names = 0;
+ int n_regular_icon_names = 0;
+ int dir_factor;
if (flags & GTK_ICON_LOOKUP_DIR_LTR)
dir_suffix = "-ltr";
@@ -1920,82 +1924,99 @@ choose_icon (GtkIconTheme *icon_theme,
else
dir_suffix = NULL;
+ dir_factor = (dir_suffix == NULL ? 1 : 2);
+
for (i = 0; icon_names[i]; i++)
{
if (icon_name_is_symbolic (icon_names[i], -1))
- has_symbolic = TRUE;
+ n_symbolic_icon_names ++;
else
- has_regular = TRUE;
+ n_regular_icon_names ++;
n_icon_names ++;
}
- if ((flags & GTK_ICON_LOOKUP_FORCE_REGULAR) && has_symbolic)
+ if ((flags & GTK_ICON_LOOKUP_FORCE_REGULAR) && n_symbolic_icon_names > 0)
{
- new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
- for (i = 0; icon_names[i]; i++)
+ int p = 0;
+
+ n_new_names = dir_factor * ((n_symbolic_icon_names * 2) + n_regular_icon_names);
+ new_names = g_alloca (sizeof (char *) * n_new_names);
+
+ for (i = 0; i < n_icon_names; i ++)
{
- if (icon_name_is_symbolic (icon_names[i], -1))
- icon_name_list_add_icon (new_names, dir_suffix, g_strndup (icon_names[i], strlen (icon_names[i])
- strlen ("-symbolic")));
+ int icon_name_len = strlen (icon_names[i]);
+
+ if (icon_name_is_symbolic (icon_names[i], icon_name_len))
+ icon_name_list_add_icon (new_names, dir_suffix, g_strndup (icon_names[i], icon_name_len - strlen
("-symbolic")), &p);
else
- icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+ icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
}
- for (i = 0; icon_names[i]; i++)
+
+ for (i = 0; i < n_icon_names; i ++)
{
if (icon_name_is_symbolic (icon_names[i], -1))
- icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+ icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
}
+ g_assert (p == n_new_names);
+
icon_info = real_choose_icon (icon_theme,
- (const gchar **) new_names->pdata,
- new_names->len,
+ (const char **)new_names,
+ n_new_names,
size,
scale,
flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR |
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
- g_ptr_array_free (new_names, TRUE);
}
- else if ((flags & GTK_ICON_LOOKUP_FORCE_SYMBOLIC) && has_regular)
+ else if ((flags & GTK_ICON_LOOKUP_FORCE_SYMBOLIC) && n_regular_icon_names > 0)
{
- new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
- for (i = 0; icon_names[i]; i++)
+ int p = 0;
+
+ n_new_names = dir_factor * ((n_regular_icon_names * 2) + n_symbolic_icon_names);
+ new_names = g_alloca (sizeof (char *) * n_new_names);
+
+ for (i = 0; i < n_icon_names; i ++)
{
if (!icon_name_is_symbolic (icon_names[i], -1))
- icon_name_list_add_icon (new_names, dir_suffix, g_strconcat (icon_names[i], "-symbolic", NULL));
+ icon_name_list_add_icon (new_names, dir_suffix, g_strconcat (icon_names[i], "-symbolic", NULL),
&p);
else
- icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+ icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
}
- for (i = 0; icon_names[i]; i++)
+
+ for (i = 0; i < n_icon_names; i ++)
{
if (!icon_name_is_symbolic (icon_names[i], -1))
- icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+ icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
}
+ g_assert (p == n_new_names);
+
icon_info = real_choose_icon (icon_theme,
- (const gchar **) new_names->pdata,
- new_names->len,
+ (const char **)new_names,
+ n_new_names,
size,
scale,
flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR |
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
-
- g_ptr_array_free (new_names, TRUE);
}
else if (dir_suffix)
{
- new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
- for (i = 0; icon_names[i]; i++)
- {
- icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
- }
+ int p = 0;
+
+ n_new_names = (dir_suffix != NULL ? 2 : 1) * n_icon_names;
+ new_names = g_alloca (sizeof (char *) * n_new_names);
+
+ for (i = 0; i < n_icon_names; i ++)
+ icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
+
+ g_assert (p == n_new_names);
icon_info = real_choose_icon (icon_theme,
- (const gchar **) new_names->pdata,
- new_names->len,
+ (const char **)new_names,
+ n_new_names,
size,
scale,
flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR |
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
-
- g_ptr_array_free (new_names, TRUE);
}
else
{
@@ -2007,6 +2028,9 @@ choose_icon (GtkIconTheme *icon_theme,
flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR |
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
}
+ for (i = 0; i < n_new_names; i ++)
+ g_free (new_names[i]);
+
return icon_info;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]